TDSQL Boundless 插入数据

如何使用 SQL 语句在 TDSQL Boundless 数据库中插入数据,包括单行插入、多行插入、指定列插入等常。

相关产品
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');

20、合理使用事务

在批量插入大量数据时,建议将多条 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行。过大的事务可能导致锁等待超时或内存占用过高。

21、临时关闭自动提交

在批量导入数据时,可以临时关闭自动提交模式,减少每条语句的提交开销。

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;

22、使用 LOAD DATA INFILE 导入大量数据

对于百万级以上的数据导入场景,建议使用 LOAD DATA INFILE 代替 INSERT 语句。LOAD DATA INFILE 通过直接读取文这篇件进行批量写入,性能远高于逐行 INSERT。

23、注意事项

在使用 INSERT 语句时,请注意以下事项:

·INSERT 语句在默认的 autocommit = 1 模式下会自动提交。如果需要回滚,请在执行 INSERT 前使用 START TRANSACTION 或 BEGIN 开启事务。

·插入数据时,数据类型必须与列定义匹配。例如,向 INT 类型列插入字符串会导致隐式类型转换或报错。

·插入的字符串值需要使用英文单引号包围。数值型数据无需使用引号。

·TDSQL Boundless 默认关闭触发器,当表上存在触发器时,INSERT 操作不会触发对应的 BEFORE INSERT 和 AFTER INSERT 触发器执行。

·插入数据时,如果违反了 NOT NULL 约束、主键约束、唯一键约束或外键约束,系统将返回错误并终止当前语句的执行。

·使用 INSERT IGNORE 时,违反约束的行将被跳过,不会中止整条语句的执行。

赞 (0)
上一篇 4天前
下一篇 4天前