首页/数据/SQL 速查/REPLACE INTO 的真实语义(删除再插入)
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

REPLACE INTO 的真实语义(删除再插入)

MySQL 的 REPLACE 不是 UPDATE:遇到唯一键冲突先 DELETE 旧行再 INSERT 新行,未给出的列会重置为默认值。

SQL 速查数据更新于 2026-10-12

示例

示例
REPLACE INTO users (id, name) VALUES (1, 'alice');
-- 等价于:DELETE FROM users WHERE id = 1; INSERT INTO users (id, name) VALUES (1, 'alice');
行为冲突行先删后插:触发器、级联外键、自增计数器都会受影响
缺列未列出的列被重置为默认值(UPDATE 不会)
建议大多数场景应改用 ON DUPLICATE KEY UPDATE 保留原值
外键 ON DELETE CASCADE 时,REPLACE 删除父行会连带删掉子表数据,属于容易造成事故的写法。

易错点

  • 把 REPLACE 当“只更新指定列”用会静默丢数据:name 之外的列全被默认值覆盖
  • REPLACE 导致的行删除会触发 ON DELETE 触发器与级联删除,审计与子表数据都受影响

数据来源与参考

  • MySQL 8.0 Reference Manual · REPLACE
  • PostgreSQL Documentation · INSERT
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌