首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL REPLACE INTO 深度解析(一):核心原理與三大衝突場景

     編輯:MySQL 綜合教學

REPLACE INTO 是什麼?

REPLACE INTO 是 MySQL 專有語法,語義為「嘗試插入,若發生主鍵/唯一鍵衝突則先刪除舊行再插入新行」。它不是標準 SQL 的 MERGE 或 UPSERT,行為細節極易踩坑。

場景一:僅有主鍵,無唯一鍵

CREATE TABLE yy (id BIGINT PRIMARY KEY, name VARCHAR(20)) ENGINE=InnoDB;
  • 插入不存在的 PK → INSERT(影響 1 行)
  • 插入已存在的 PK → UPDATE(影響 2 行:1 刪 + 1 插,binlog 記錄為 UPDATE)

主鍵衝突執行計劃

場景二:同時存在主鍵與唯一鍵

CREATE TABLE yy (
  id INT PRIMARY KEY,
  b INT, c INT,
  UNIQUE KEY uk_bc (b,c)
) ENGINE=InnoDB;

情形 1:主鍵衝突(PK conflict)

執行 REPLACE INTO yy VALUES(1,2,5) 衝突 id=1 → DELETE 舊行 + INSERT 新行,binlog 記錄為 DELETE + INSERT,自增 ID 會 +1。

情形 2:唯一鍵衝突(UK conflict)

執行 REPLACE INTO yy VALUES(5,3,6) 唯一鍵 (3,6) 與 id=4 衝突 → UPDATE 該行,將 id 從 4 改為 5,binlog 記錄為 UPDATE,自增 ID 同樣 +1。

情形 3:主鍵與唯一鍵同時衝突

執行 REPLACE INTO yy VALUES(1,3,6):

  • PK=1 與現有 id=1 衝突
  • UK=(3,6) 與現有 id=5 衝突
→ MySQL 先 DELETE id=1,再 UPDATE id=5 將 PK 改為 1,影響 3 行(2 刪 + 1 更),binlog 記錄為 DELETE + UPDATE。

核心結論

衝突類型底層操作影響行數自增 ID 變化
無衝突INSERT1+1
PK 衝突DELETE + INSERT2+1
UK 衝突UPDATE2+1
PK+UK 同時衝突DELETE + UPDATE3+1

警示:REPLACE INTO 會導致主鍵值「跳躍」與「重組」,嚴重依賴自增 ID 的業務嚴禁使用。後續將介紹生產環境替代方案 INSERT ... ON DUPLICATE KEY UPDATE。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved