产品概述
应用场景
产品架构
实例类型
兼容性说明
使用规范建议
INSERT 权限。INSERT 语句插入数据。以下是常用的几种插入方式。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 语句中指定多组 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 语法以"列名 = 值"的形式逐列赋值,适用于仅需为部分列指定值的场景。未指定的列将使用默认值或 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 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 在大数据量场景下可能会对源表产生较长时间的读锁,建议在业务低峰期执行。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 在遇到主键或唯一键冲突时,不会忽略该行,而是执行 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 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 从文本文件中读取数据并批量导入到目标表中,适用于大数据量导入场景。相比逐行 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 权限,且数据文件的路径对数据库服务端可访问。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 参数调整单条语句的最大允许大小。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');
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;
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 代替 INSERT 语句。LOAD DATA INFILE 通过直接读取文本文件进行批量写入,性能远高于逐行 INSERT。INSERT 语句时,请注意以下事项:INSERT 语句在默认的 autocommit = 1 模式下会自动提交。如果需要回滚,请在执行 INSERT 前使用 START TRANSACTION 或 BEGIN 开启事务。INT 类型列插入字符串会导致隐式类型转换或报错。INSERT 操作不会触发对应的 BEFORE INSERT 和 AFTER INSERT 触发器执行。NOT NULL 约束、主键约束、唯一键约束或外键约束,系统将返回错误并终止当前语句的执行。INSERT IGNORE 时,违反约束的行将被跳过,不会中止整条语句的执行。Esta página foi útil?
Você também pode entrar em contato com a Equipe de vendas ou Enviar um tíquete em caso de ajuda.
comentários