tencent cloud

TDSQL Boundless

插入数据

PDF
聚焦模式
字号
最后更新时间: 2026-03-30 10:14:12
本文介绍如何使用 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 列,可以使用 NULL0 来让系统自动生成值。不建议在生产环境中使用此方式,因为表结构变更可能导致语句执行失败。

使用 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, ..., columnN
FROM source_table
WHERE condition;
示例
以下示例将技术部的员工数据插入到一张归档表中。
-- 创建归档表
CREATE TABLE employees_archive LIKE employees;

-- 将技术部员工数据插入归档表
INSERT INTO employees_archive (name, department, salary, hire_date)
SELECT name, department, salary, hire_date
FROM employees
WHERE 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 会先删除旧行再插入新行,相当于执行了一次 DELETEINSERT 操作,请在使用前确认业务逻辑是否允许删除旧行。

批量导入数据

当需要导入大量数据时,逐行执行 INSERT 语句效率较低。TDSQL Boundless 支持通过以下方式实现高效的批量数据导入。

使用 LOAD DATA INFILE 导入

LOAD DATA INFILE 从文本文件中读取数据并批量导入到目标表中,适用于大数据量导入场景。相比逐行 INSERT,该语句的导入速度可提升数十倍。
语法格式
LOAD DATA INFILE 'file_path'
INTO TABLE table_name
FIELDS 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 employees
FIELDS 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');

-- 为自增列指定 NULL
INSERT 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 TRANSACTIONBEGIN 开启事务。
插入数据时,数据类型必须与列定义匹配。例如,向 INT 类型列插入字符串会导致隐式类型转换或报错。
插入的字符串值需要使用英文单引号包围。数值型数据无需使用引号。
TDSQL Boundless 默认关闭触发器,当表上存在触发器时,INSERT 操作不会触发对应的 BEFORE INSERTAFTER INSERT 触发器执行。
插入数据时,如果违反了 NOT NULL 约束、主键约束、唯一键约束或外键约束,系统将返回错误并终止当前语句的执行。
使用 INSERT IGNORE 时,违反约束的行将被跳过,不会中止整条语句的执行。

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈