mysql主键或唯一键冲突会报错而非覆盖,可用insert ignore、on duplicate key update或捕获1062错误处理;null与''语义不同,需区分使用;批量插入应显式列名、合并values、控制批次大小,并注意索引优化。

INSERT 语句写错主键或唯一键会直接报错
MySQL 遇到重复的 PRIMARY KEY 或 UNIQUE 值时,不会静默覆盖,而是抛出错误:ERROR 1062 (23000): Duplicate entry 'xxx' for key 'yyy'。这不是语法问题,是约束拦截。
- 想跳过冲突继续插下一条,用
INSERT IGNORE—— 但注意:它对所有警告(包括字段截断、类型转换)都静默忽略,不推荐无差别使用 - 想冲突时更新已有行,用
INSERT ... ON DUPLICATE KEY UPDATE,只触发一次 SQL,比先查再插再更安全 - 想严格保证不重复且失败即止,就用原生
INSERT,靠应用层捕获1062错误做后续处理
VALUES 里混用 NULL 和空字符串容易引发逻辑 bug
NULL 表示“未知/不存在”,空字符串 '' 是一个确定的、长度为 0 的字符串,二者在索引、排序、COUNT()、GROUP BY 中行为完全不同。
-
WHERE column = ''查不到NULL值;WHERE column IS NULL也查不到'' - 如果字段定义为
NOT NULL但没设默认值,插NULL会报错:ERROR 1048 (23000): Column 'xxx' cannot be null - 批量导入时,CSV 中缺失字段常被转成
NULL,而业务可能期望是'',需在INSERT前用COALESCE(col, '')或应用层兜底
批量插入用 VALUES 多组比循环单条快一个数量级
单条 INSERT INTO t(a,b) VALUES (1,2) 走一次网络往返 + 一次事务开销;100 条这样插,就是 100 次。合并后:INSERT INTO t(a,b) VALUES (1,2), (3,4), (5,6),一次提交即可。
十天学会易语言图解教程用图解的方式对易语言的使用方法和操作技巧作了生动、系统的讲解。需要的朋友们可以下载看看吧!全书分十章,分十天讲完。 第一章是介绍易语言的安装,以及运行后的界面。同时介绍一个非常简单的小程序,以帮助用户入门学习。最后介绍编程的输入方法,以及一些初学者会遇到的常见问题。第二章将接触一些具体的问题,如怎样编写一个1+2等于几的程序,并了解变量的概念,变量的有效范围,数据类型等知识。其后,您将跟着本书,编写一个自己的MP3播放器,认识窗口、按钮、编辑框三个常用组件。以认识命令及事件子程序。第
- MySQL 默认单次
max_allowed_packet限制约 4MB,别一次性塞几万行,建议每批 1000–5000 行 - 如果表有大量索引,关掉再开(
ALTER TABLE t DISABLE KEYS)能提速,但仅适用于 MyISAM;InnoDB 不支持,得靠调大innodb_buffer_pool_size和关掉唯一检查(SET unique_checks=0)临时加速 - 用
LOAD DATA INFILE比拼接VALUES更快,但要求文件在 MySQL 服务端磁盘上,且需FILE权限
没有显式指定列名的 INSERT 在表结构变更后极易崩
写成 INSERT INTO t VALUES (1,'a',NOW()) 看似简洁,但只要表加了新字段(尤其非空无默认值)、删了字段、或调整了字段顺序,这条语句立刻失效,报错:ERROR 1136 (21S01): Column count doesn't match value count at row 1。
- 永远显式写出列名:
INSERT INTO t(id,name,created_at) VALUES (1,'a',NOW()) - 如果字段多,用程序生成列名列表比手敲靠谱;IDE 或客户端工具(如 DBeaver)可自动生成带列名的模板
- 视图或临时表上执行
INSERT时,列名必须与视图 SELECT 列完全一致,不能依赖底层表结构
最麻烦的不是语法错,是那种「上线后跑了一周才因某张表加字段突然挂掉」的情况——列名省那几个字,换来的往往是半夜三点的报警电话。









