MySQL作为常用的关系型数据库,提供了多种插入多条记录的方式,开发者可以根据数据来源、插入量等场景选择对应的方法,避免逐条插入带来的性能损耗。

基础INSERT多值插入法
这是最常用的批量插入方式,通过在INSERT语句中指定多个值组,一次性插入多条记录,语法简洁且执行效率高。
基本语法格式如下:
INSERT INTO 表名 (列1, 列2, 列3) VALUES (值1_1, 值1_2, 值1_3), (值2_1, 值2_2, 值2_3), (值3_1, 值3_2, 值3_3);
假设我们有一个用户表user_info,结构包含id、username、age三个字段,要插入三条用户记录可以这样写:
INSERT INTO user_info (username, age)
VALUES
('张三', 25),
('李四', 28),
('王五', 22);
这种方式的优点是语句简单,执行时只需要一次数据库交互,适合插入数据量不大(通常建议单次插入不超过1000条,避免SQL语句过长)的场景。
INSERT INTO SELECT批量插入法
如果需要插入的数据来源于其他表或者查询结果,可以使用INSERT INTO SELECT语法,将查询得到的结果集直接插入到目标表中。
基本语法格式如下:
INSERT INTO 目标表 (列1, 列2, 列3) SELECT 列1, 列2, 列3 FROM 源表 WHERE 筛选条件;
例如我们要把temp_user表中年龄大于20的用户信息同步到user_info表中:
INSERT INTO user_info (username, age) SELECT username, age FROM temp_user WHERE age > 20;
这种方式适合数据迁移、表数据同步的场景,不需要手动构造每个值,直接基于已有数据完成批量插入。
临时表批量插入法
当需要插入的数据量非常大,或者数据来源于外部文件、程序批量生成时,可以先创建临时表,将批量数据导入临时表,再通过INSERT INTO SELECT将数据同步到目标表。
操作步骤分为三步:
- 创建临时表,结构与目标表匹配或者包含需要的字段
- 将批量数据导入临时表,可以通过LOAD DATA、程序批量写入等方式
- 执行INSERT INTO SELECT将临时表数据同步到目标表
示例代码如下:
-- 创建临时表
CREATE TEMPORARY TABLE temp_batch_user (
username VARCHAR(50),
age INT
);
-- 假设通过程序或者LOAD DATA将批量数据写入临时表后,执行同步
INSERT INTO user_info (username, age)
SELECT username, age FROM temp_batch_user;
-- 临时表会在连接关闭后自动删除,也可以手动删除
DROP TEMPORARY TABLE IF EXISTS temp_batch_user;
批量插入的注意事项
在使用批量插入时,需要注意以下几点:
- 单次插入的数据量不宜过大,避免SQL语句超过
max_allowed_packet配置的限制,导致执行失败 - 如果目标表有自增主键,批量插入时不需要指定自增字段的值,数据库会自动生成
- 如果插入的数据可能存在重复,可以结合
IGNORE关键字或者ON DUPLICATE KEY UPDATE语句处理冲突,例如:
-- 忽略重复记录
INSERT IGNORE INTO user_info (username, age)
VALUES
('张三', 25),
('李四', 28);
-- 存在重复时更新字段
INSERT INTO user_info (username, age)
VALUES
('张三', 26)
ON DUPLICATE KEY UPDATE age = VALUES(age);
不同的批量插入方法适用场景不同,小批量手动插入优先选择多值INSERT语法,跨表数据同步选择INSERT INTO SELECT,大批量数据导入可以结合临时表实现,开发者可以根据实际业务需求选择最合适的方式。