tencent cloud

TDSQL Boundless

产品动态
产品简介
产品概述
应用场景
产品架构
实例类型
兼容性说明
使用规范建议
自研内核
内核概述
内核版本更新动态
功能类特性
性能类特性
产品计费
计费概述
购买方式
价格详情
续费说明
欠费说明
退费说明
快速入门
创建实例
连接实例
用户指南
数据迁移
数据同步/订阅
实例管理
参数配置
账号管理
安全组
备份与恢复
数据库审计
标签管理
实践教程
Online DDL 的技术演进与使用实践
锁机制解析与问题排查实践
数据智能调度及相关性能优化实践
TDSQL Boundless 选型指南与实践教程
开发指南
开发指南(MySQL 兼容模式)
开发指南(HBase 兼容模式)
性能调优
性能调优概述
SQL 调优
DDL 调优
性能白皮书
性能概述
TPC-C 测试
Sysbench 测试
API 文档
History
Introduction
API Category
Making API Requests
Instance APIs
Security Group APIs
Task APIs
Backup APIs
Rollback APIs
Parameter APIs
Database APIs
Data Types
Error Codes
通用参考
系统原理
SQL 参考
数据库参数说明
TPC-H 基准测试数据模型参考
错误码信息
安全与合规
常见问题
服务协议
服务等级协议
服务条款
隐私政策
数据处理和安全协议
联系我们
词汇表

插入数据

PDF
Modo Foco
Tamanho da Fonte
Última atualização: 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 时,违反约束的行将被跳过,不会中止整条语句的执行。

Ajuda e Suporte

Esta página foi útil?

comentários