本文介绍如何使用 SQL 语句在 TDSQL Boundless 数据库中插入数据,包括单行插入、多行插入、指定列插入等常见操作方式,以及插入数据时的性能优化建议和注意事项。
前提条件
在执行数据插入操作之前,请确认已满足以下条件:
已创建 TDSQL Boundless 实例并完成连接。请参见 连接数据库。
已创建目标数据库和表。请参见创建表。
当前用户拥有目标表的
INSERT 权限。插入数据的方式
TDSQL Boundless 兼容 MySQL 协议,支持标准的 SQL
INSERT 语句插入数据。以下是常用的几种插入方式。使用 INSERT INTO...VALUES 插入单行数据
INSERT INTO...VALUES 是最基础的数据插入方式,适用于向表中插入单行数据。语法格式
INSERT INTO table_name (column1, column2, ..., columnN)VALUES (value1, value2, ..., valueN);
参数说明
参数 | 说明 |
table_name | 目标表名 |
column1, column2, ..., columnN | 目标列名列表,列名之间使用英文逗号分隔 |
value1, value2, ..., valueN | 与列名一一对应的值列表 |
示例
以下示例创建一张员工信息表,并向表中插入一条记录。
-- 创建员工信息表CREATE TABLE employees (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100) NOT NULL,department VARCHAR(50),salary DECIMAL(10, 2),hire_date DATE);-- 插入一条员工记录INSERT INTO employees (name, department, salary, hire_date)VALUES ('张三', '技术部', 15000.00, '2026-01-15');
执行成功后,返回结果如下:
Query OK, 1 row affected (0.01 sec)
使用 INSERT INTO...VALUES 插入多行数据
如果需要同时插入多行数据,可以在一条
INSERT 语句中指定多组 VALUES 值。多行插入通常比逐行执行多条单行插入语句性能更优,因为可以减少客户端与服务端之间的网络交互次数。语法格式
INSERT INTO table_name (column1, column2, ..., columnN)VALUES(value1_1, value1_2, ..., value1_N),(value2_1, value2_2, ..., value2_N),...(valueM_1, valueM_2, ..., valueM_N);
示例
INSERT INTO employees (name, department, salary, hire_date)VALUES('李四', '产品部', 13000.00, '2026-02-01'),('王五', '技术部', 16000.00, '2026-02-15'),('赵六', '市场部', 12000.00, '2026-03-01');
执行成功后,返回结果如下:
Query OK, 3 rows affected (0.01 sec)Records: 3 Duplicates: 0 Warnings: 0
说明:
多行插入的单条语句大小受
max_allowed_packet 参数限制。如果插入的数据量较大,建议适当分批执行。不指定列名插入数据
如果
VALUES 子句中提供的值与表中各列的顺序和数量完全一致,可以省略列名列表。语法格式
INSERT INTO table_name VALUES (value1, value2, ..., valueN);
示例
INSERT INTO employees VALUES (NULL, '孙七', '运营部', 11000.00, '2026-03-10');
注意:
省略列名时,
VALUES 中的值必须按照表结构中列的顺序和数量完整提供。对于 AUTO_INCREMENT 列,可以使用 NULL 或 0 来让系统自动生成值。不建议在生产环境中使用此方式,因为表结构变更可能导致语句执行失败。使用 INSERT INTO...SET 插入数据
INSERT INTO...SET 语法以"列名 = 值"的形式逐列赋值,适用于仅需为部分列指定值的场景。未指定的列将使用默认值或 NULL。语法格式
INSERT INTO table_name SET column1 = value1, column2 = value2, ...;
示例
INSERT INTO employees SET name = '周八', department = '技术部', salary = 14000.00, hire_date = '2026-03-15';
使用 INSERT INTO...SELECT 从其他表插入数据
INSERT INTO...SELECT 语句用于将一个表的查询结果插入到另一个表中,适用于表间数据迁移或汇总。语法格式
INSERT INTO target_table (column1, column2, ..., columnN)SELECT column1, column2, ..., columnNFROM source_tableWHERE condition;
示例
以下示例将技术部的员工数据插入到一张归档表中。
-- 创建归档表CREATE TABLE employees_archive LIKE employees;-- 将技术部员工数据插入归档表INSERT INTO employees_archive (name, department, salary, hire_date)SELECT name, department, salary, hire_dateFROM employeesWHERE department = '技术部';
说明:
INSERT INTO...SELECT 在大数据量场景下可能会对源表产生较长时间的读锁,建议在业务低峰期执行。插入时处理主键或唯一键冲突
当目标表存在主键或唯一键约束时,插入重复数据会导致报错。TDSQL Boundless 提供了以下几种方式来避免报错。
使用 INSERT IGNORE 忽略冲突
INSERT IGNORE 在遇到主键或唯一键冲突时,会忽略冲突行,不插入该行数据,并继续执行后续的插入操作。语法格式
INSERT IGNORE INTO table_name (column1, column2, ...)VALUES (value1, value2, ...);
示例
-- 假设 id=1 的记录已经存在INSERT IGNORE INTO employees (id, name, department, salary, hire_date)VALUES (1, '新员工', '技术部', 20000.00, '2026-03-20');
执行成功后,返回结果如下:
Query OK, 0 rows affected, 1 warning (0.00 sec)
说明:
INSERT IGNORE 不会返回错误,但会产生一个 warning。可以使用 SHOW WARNINGS 查看具体的冲突信息。使用 INSERT...ON DUPLICATE KEY UPDATE 冲突时更新
INSERT...ON DUPLICATE KEY UPDATE 在遇到主键或唯一键冲突时,不会忽略该行,而是执行 UPDATE 子句中指定的更新操作。该语句适用于"不存在则插入,存在则更新"的场景。语法格式
INSERT INTO table_name (column1, column2, ..., columnN)VALUES (value1, value2, ..., valueN)ON DUPLICATE KEY UPDATE column1 = new_value1, column2 = new_value2, ...;
示例
INSERT INTO employees (id, name, department, salary, hire_date)VALUES (1, '张三', '技术部', 18000.00, '2026-01-15')ON DUPLICATE KEY UPDATE salary = 18000.00;
如果
id=1 的记录已存在,执行该语句后,salary 字段将被更新为18000.00。注意:
当表中存在多个唯一键时,
INSERT...ON DUPLICATE KEY UPDATE 可能匹配到非预期的唯一键,导致更新了非目标行。建议仅在单唯一键的表上使用此语法。使用 REPLACE INTO 替换数据
REPLACE INTO 在遇到主键或唯一键冲突时,会先删除旧行,再插入新行。语法格式
REPLACE INTO table_name (column1, column2, ..., columnN)VALUES (value1, value2, ..., valueN);
示例
REPLACE INTO employees (id, name, department, salary, hire_date)VALUES (1, '张三', '技术部', 20000.00, '2026-01-15');
警告:
REPLACE INTO 会先删除旧行再插入新行,相当于执行了一次 DELETE 和 INSERT 操作,请在使用前确认业务逻辑是否允许删除旧行。批量导入数据
当需要导入大量数据时,逐行执行
INSERT 语句效率较低。TDSQL Boundless 支持通过以下方式实现高效的批量数据导入。使用 LOAD DATA INFILE 导入
LOAD DATA INFILE 从文本文件中读取数据并批量导入到目标表中,适用于大数据量导入场景。相比逐行 INSERT,该语句的导入速度可提升数十倍。语法格式
LOAD DATA INFILE 'file_path'INTO TABLE table_nameFIELDS TERMINATED BY ','ENCLOSED BY '"'LINES TERMINATED BY '\\n'IGNORE 1 ROWS;
参数说明
参数 | 说明 |
file_path | 数据文件路径 |
FIELDS TERMINATED BY | 字段分隔符,例如 ,表示逗号分隔 |
ENCLOSED BY | 字段值的包围符,例如 "表示双引号 |
LINES TERMINATED BY | 行分隔符,例如 \\n 表示换行符 |
IGNORE 1 ROWS | 忽略文件的第一行(通常为表头) |
示例
LOAD DATA INFILE '/tmp/employees.csv'INTO TABLE employeesFIELDS TERMINATED BY ','ENCLOSED BY '"'LINES TERMINATED BY '\\n'IGNORE 1 ROWS(name, department, salary, hire_date);
说明:
使用
LOAD DATA INFILE 时,需要确保当前用户拥有 FILE 权限,且数据文件的路径对数据库服务端可访问。使用多行 INSERT 批量插入
当不便使用
LOAD DATA INFILE 时,可以通过在一条 INSERT 语句中包含多个 VALUES 子句来实现批量插入。示例
INSERT INTO employees (name, department, salary, hire_date) VALUES('员工A', '技术部', 15000.00, '2026-01-01'),('员工B', '产品部', 13000.00, '2026-01-02'),('员工C', '市场部', 12000.00, '2026-01-03'),...('员工N', '运营部', 11000.00, '2026-01-30');
说明:
建议每条
INSERT 语句包含100 - 1000行数据,避免单条语句过大。可以通过 max_allowed_packet 参数调整单条语句的最大允许大小。自增列与插入
TDSQL Boundless 支持
AUTO_INCREMENT 自增列。在插入数据时,可以通过以下方式处理自增列。自动生成自增值
在插入数据时,省略自增列或为其指定
NULL 值,系统将自动分配一个递增的唯一值。-- 省略自增列INSERT INTO employees (name, department, salary, hire_date)VALUES ('测试员工', '技术部', 10000.00, '2026-03-19');-- 为自增列指定 NULLINSERT INTO employees (id, name, department, salary, hire_date)VALUES (NULL, '测试员工2', '技术部', 10000.00, '2026-03-19');
显式指定自增值
用户也可以为自增列显式指定一个值。如果指定的值不与已有记录冲突,则使用指定值。
INSERT INTO employees (id, name, department, salary, hire_date)VALUES (1000, '指定ID员工', '技术部', 10000.00, '2026-03-19');
说明:
显式指定自增值后,系统的自增计数器会自动调整为当前最大值加1。后续的自动分配值将从该值继续递增。
性能优化建议
在进行数据插入操作时,可以参考以下建议提升写入性能。
使用多行 INSERT 代替单行 INSERT
多行
INSERT 可以减少 SQL 语句的解析次数和网络往返次数,在批量插入场景下性能优势明显。推荐写法
INSERT INTO employees (name, department, salary, hire_date) VALUES('员工1', '技术部', 15000.00, '2026-01-01'),('员工2', '产品部', 13000.00, '2026-01-02'),('员工3', '市场部', 12000.00, '2026-01-03');
不推荐写法
INSERT INTO employees (name, department, salary, hire_date) VALUES ('员工1', '技术部', 15000.00, '2026-01-01');INSERT INTO employees (name, department, salary, hire_date) VALUES ('员工2', '产品部', 13000.00, '2026-01-02');INSERT INTO employees (name, department, salary, hire_date) VALUES ('员工3', '市场部', 12000.00, '2026-01-03');
合理使用事务
在批量插入大量数据时,建议将多条
INSERT 语句放在一个事务中统一提交,避免每条语句单独提交带来的额外开销。START TRANSACTION;INSERT INTO employees (name, department, salary, hire_date) VALUES ('员工1', '技术部', 15000.00, '2026-01-01');INSERT INTO employees (name, department, salary, hire_date) VALUES ('员工2', '产品部', 13000.00, '2026-01-02');-- 更多 INSERT 语句COMMIT;
注意:
单个事务中的数据量不宜过大。如果插入数据量很大,建议分批提交,每批1000 - 10000行。过大的事务可能导致锁等待超时或内存占用过高。
临时关闭自动提交
在批量导入数据时,可以临时关闭自动提交模式,减少每条语句的提交开销。
SET autocommit = 0;INSERT INTO employees (name, department, salary, hire_date) VALUES ('员工1', '技术部', 15000.00, '2026-01-01');INSERT INTO employees (name, department, salary, hire_date) VALUES ('员工2', '产品部', 13000.00, '2026-01-02');-- 更多 INSERT 语句COMMIT;SET autocommit = 1;
使用 LOAD DATA INFILE 导入大量数据
对于百万级以上的数据导入场景,建议使用
LOAD DATA INFILE 代替 INSERT 语句。LOAD DATA INFILE 通过直接读取文本文件进行批量写入,性能远高于逐行 INSERT。注意事项
在使用
INSERT 语句时,请注意以下事项:INSERT 语句在默认的 autocommit = 1 模式下会自动提交。如果需要回滚,请在执行 INSERT 前使用 START TRANSACTION 或 BEGIN 开启事务。插入数据时,数据类型必须与列定义匹配。例如,向
INT 类型列插入字符串会导致隐式类型转换或报错。插入的字符串值需要使用英文单引号包围。数值型数据无需使用引号。
TDSQL Boundless 默认关闭触发器,当表上存在触发器时,
INSERT 操作不会触发对应的 BEFORE INSERT 和 AFTER INSERT 触发器执行。插入数据时,如果违反了
NOT NULL 约束、主键约束、唯一键约束或外键约束,系统将返回错误并终止当前语句的执行。使用
INSERT IGNORE 时,违反约束的行将被跳过,不会中止整条语句的执行。