MySQL的REPLACE INTO ID跳跃原因何在?先DELETE再INSERT原理解析。
- 内容介绍
- 文章标签
- 相关推荐
本文共计1110个文字,预计阅读时间需要5分钟。
由于它的底层是DELETE和INSERT操作,而不是原地更新,MySQL会先删除旧行,然后执行一次全新的插入操作。仅当存在唯一键(PRIMARY KEY或任意UNIQUE索引)时,MySQL才会发生这种冲突。如果发生冲突,MySQL会先删除旧行,然后执行一次全新的插入操作——即INSERT阶段。对于阶段一,一定会请求下一个自增值,因为你明确指定了id字段。只有当该列没有出现在REPLACE INTO的列列表中时,InnoDB才会分配新的ID。
常见错误现象:Duplicate entry 'x' for key 'PRIMARY' 没报错,但业务日志里发现 created_at 时间被重置、软删除标记丢失、外键关联数据意外级联删除——这些都不是“更新”该有的行为。
- 即使表只有 1 行,执行一次
REPLACE INTO冲突,自增 ID 就跳 1 - 连续 5 次冲突,ID 就跳 5 步,中间空缺无法回收
- 如果唯一键是
email,主键是自增id,那么每次REPLACE都生成新id,旧id对应的行物理消失
REPLACE INTO 和 INSERT ... ON DUPLICATE KEY UPDATE 的核心区别
两者都处理唯一键冲突,但语义和实现完全不同:INSERT ... ON DUPLICATE KEY UPDATE 在检测到冲突后直接执行 UPDATE,不删行、不重新分配 ID、不重建索引、不触发 DELETE 触发器。
本文共计1110个文字,预计阅读时间需要5分钟。
由于它的底层是DELETE和INSERT操作,而不是原地更新,MySQL会先删除旧行,然后执行一次全新的插入操作。仅当存在唯一键(PRIMARY KEY或任意UNIQUE索引)时,MySQL才会发生这种冲突。如果发生冲突,MySQL会先删除旧行,然后执行一次全新的插入操作——即INSERT阶段。对于阶段一,一定会请求下一个自增值,因为你明确指定了id字段。只有当该列没有出现在REPLACE INTO的列列表中时,InnoDB才会分配新的ID。
常见错误现象:Duplicate entry 'x' for key 'PRIMARY' 没报错,但业务日志里发现 created_at 时间被重置、软删除标记丢失、外键关联数据意外级联删除——这些都不是“更新”该有的行为。
- 即使表只有 1 行,执行一次
REPLACE INTO冲突,自增 ID 就跳 1 - 连续 5 次冲突,ID 就跳 5 步,中间空缺无法回收
- 如果唯一键是
email,主键是自增id,那么每次REPLACE都生成新id,旧id对应的行物理消失
REPLACE INTO 和 INSERT ... ON DUPLICATE KEY UPDATE 的核心区别
两者都处理唯一键冲突,但语义和实现完全不同:INSERT ... ON DUPLICATE KEY UPDATE 在检测到冲突后直接执行 UPDATE,不删行、不重新分配 ID、不重建索引、不触发 DELETE 触发器。

