REPLACE INTO 是 MySQL 專有語法,語義為「嘗試插入,若發生主鍵/唯一鍵衝突則先刪除舊行再插入新行」。它不是標準 SQL 的 MERGE 或 UPSERT,行為細節極易踩坑。
CREATE TABLE yy (id BIGINT PRIMARY KEY, name VARCHAR(20)) ENGINE=InnoDB;

CREATE TABLE yy (
id INT PRIMARY KEY,
b INT, c INT,
UNIQUE KEY uk_bc (b,c)
) ENGINE=InnoDB;
執行 REPLACE INTO yy VALUES(1,2,5) 衝突 id=1 → DELETE 舊行 + INSERT 新行,binlog 記錄為 DELETE + INSERT,自增 ID 會 +1。
執行 REPLACE INTO yy VALUES(5,3,6) 唯一鍵 (3,6) 與 id=4 衝突 → UPDATE 該行,將 id 從 4 改為 5,binlog 記錄為 UPDATE,自增 ID 同樣 +1。
執行 REPLACE INTO yy VALUES(1,3,6):
| 衝突類型 | 底層操作 | 影響行數 | 自增 ID 變化 |
|---|---|---|---|
| 無衝突 | INSERT | 1 | +1 |
| PK 衝突 | DELETE + INSERT | 2 | +1 |
| UK 衝突 | UPDATE | 2 | +1 |
| PK+UK 同時衝突 | DELETE + UPDATE | 3 | +1 |
警示:REPLACE INTO 會導致主鍵值「跳躍」與「重組」,嚴重依賴自增 ID 的業務嚴禁使用。後續將介紹生產環境替代方案
INSERT ... ON DUPLICATE KEY UPDATE。