INSERT IGNORE仅对主键或唯一索引冲突生效,其他错误照常报错;未建对应约束则完全无效,必须用SHOW CREATE TABLE确认索引存在且覆盖目标字段。
不是万能静默开关,它只对主键或唯一索引冲突生效,其他错误照常中断执行。
为什么 INSERT IGNORE 没跳过重复数据?
根本原因几乎总是:目标字段没建
或
约束。MySQL 不会“智能比对整行”,只靠索引触发冲突检测。
用
确认输出里真有
或
覆盖你要去重的列(比如想按
去重,但表里只有
是主键,
没加唯一索引,那
就完全无效)
已有重复值时,
会失败,得先
或
清理
复合唯一索引要完整匹配,比如索引是
,但插入时只给
值,约束不生效,
也跳不过
INSERT IGNORE 返回值怎么判断才靠谱?
的返回值不是“成功/失败”二值判断,而是三种状态:
1
:新插入一行(正常)
0
:因唯一冲突被跳过(这是你期望的“忽略”行为)
-1
:发生未被
覆盖的错误,比如
(字段超长)、
(非法时间格式)、
字段插了
不能只写
就认为数据进去了——
才可能是你想要的结果,
才真出问题。更稳妥的做法是执行后立刻跑
,看有没有
这类提示。
INSERT IGNORE 和 ON DUPLICATE KEY UPDATE 能混用吗?
不能。语法直接报错。有人误写成:
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
这会触发 MySQL 的语法解析失败。二者语义互斥:
要“只新增、不覆盖、不报错”,就用
要“存在则更新指定字段”,就用
是删+插,会重置自增 ID、触发
和
触发器,和
完全不同
批量插入时容易被忽略的副作用
在事务中看似安全,但有几个隐蔽点:
即使某行被忽略,
值仍会 +1,长期运行可能导致 ID 稀疏甚至溢出
被忽略的语句仍算作已执行,不会回滚整条语句,但会影响
的返回值
如果用在
场景,别依赖
—— 它默认抛
,必须配合原生
+
才有效
真正要小心的,从来不是“它没跳过”,而是“它跳过了,但你没意识到自增 ID 已经悄悄涨了一截”。
INSERT IGNOREPRIMARY KEYUNIQUESHOW CREATE TABLE your_tableUNIQUE KEYPRIMARY KEYemailidemailINSERT IGNOREALTER TABLE t ADD UNIQUE KEY uniq_email (email)DELETEGROUP BY(org_id, email)emailINSERT IGNOREmysql_affected_rows()IGNOREERROR 1406ERROR 1292NOT NULLNULLif (affected > 0)0-1SHOW WARNINGSDuplicate entry 'xxx' for key 'PRIMARY'INSERT IGNORE INTO t (a,b) VALUES (1,2) ON DUPLICATE KEY UPDATE b=3;INSERT IGNOREINSERT ... ON DUPLICATE KEY UPDATEREPLACE INTOBEFORE DELETEAFTER INSERTIGNOREINSERT IGNOREAUTO_INCREMENTLAST_INSERT_ID()pandas.to_sqlif_exists='append'IntegrityErrorINSERT IGNOREmethod='multi'