mysql批量插入多值语法为:insert into 表名(列名) values (值1), (值2), ...;需确保每组括号内字段数一致、字符串加单引号、null不加引号、末尾无多余逗号。

INSERT INTO ... VALUES 多值语法怎么写才不报错
MySQL 批量插入最直接的方式就是用单条 INSERT INTO 语句带多个值组,语法本身简单,但容易因格式或长度问题失败。
正确写法是:在 VALUES 后连续列出括号包裹的值组,用英文逗号分隔,每组内字段数必须和列名(或表结构)严格一致。
INSERT INTO users (name, age) VALUES ('Alice', 25), ('Bob', 30), ('Charlie', 28);- 如果省略列名,必须按表定义顺序提供全部非自增/非默认字段的值
- 字符串要用单引号,
NULL直接写,不要加引号 - 值组之间不能有逗号遗漏,也不能多出逗号(如末尾逗号会触发
1064 You have an error in your SQL syntax)
一次插多少行才合理:受 max_allowed_packet 和性能影响
理论上一条 INSERT 可以塞几百甚至上千行,但实际受 MySQL 服务端配置 max_allowed_packet 限制——它控制单次请求最大字节数,默认通常为 4MB。
- 估算方法:一行数据约占用 N 字节(含引号、逗号、转义),1000 行 × 平均 200 字节 ≈ 200KB,远低于默认值;但若字段含长文本或二进制,几十行就可能超限
- 超限会报错:
Packet for query is too large,此时必须拆分批次 - 性能上,50–500 行/批较均衡:太小(如每次 5 行)导致网络往返和解析开销占比高;太大(如 5000 行)易触发锁等待或事务日志压力
批量插入时主键冲突怎么安全处理
遇到重复主键或唯一键时,直接执行会报 1062 Duplicate entry 错误。根据业务需求选择不同策略:
- 忽略冲突:用
INSERT IGNORE INTO ... VALUES,冲突行被跳过,其余继续插入,返回影响行数可能小于预期 - 存在则更新:用
INSERT INTO ... VALUES (...) ON DUPLICATE KEY UPDATE name=VALUES(name), age=VALUES(age),注意VALUES(col)指的是本次尝试插入的值,不是当前行原值 - 避免用
REPLACE INTO:它本质是 DELETE + INSERT,会引发自增 ID 跳变、触发器重复执行、外键级联异常等问题
Python 或 Node.js 中拼接多值 SQL 的常见陷阱
手动生成 SQL 字符串拼接多值时,极易引入 SQL 注入或格式错误,尤其当字段含单引号、反斜杠或空值时。
- 绝对不要用 Python 的
f"('{name}', {age})"或 JS 的模板字符串直接插值 - Python 应用
cursor.executemany()(底层自动拆批+参数化),或用mysql-connector-python的executemany方法传二维列表 - Node.js 推荐
mysql2的connection.query('INSERT INTO t VALUES ?', [rows]),它会自动展开数组并转义 - 若必须拼 SQL(如某些 ORM 不支持批量),务必对每个字段单独调用 escape 函数,而不是只对整个字符串做 replace
autocommit=False 导致每条语句自动提交,彻底失去批量优势。











