REPLACE INTO = INSERT + DELETE(衝突時)。流程:
返回值 = 刪除行數 + 插入行數。單行返回 1 表示純插入,>1 表示有替換發生。
-- 1. VALUES 形式
REPLACE INTO tbl (col1, col2) VALUES (v1, v2), (v3, v4);
-- 2. SET 形式
REPLACE INTO tbl SET col1=v1, col2=v2;
-- 3. SELECT 形式
REPLACE INTO tbl (col1, col2) SELECT col1, col2 FROM src_tbl;
舊行刪除、新行插入,自增 ID 重新分配。所有引用該 ID 的外鍵關聯瞬間失效。
每次替換消耗一個自增值。長期高頻操作會讓 BIGINT 甚至 INT 達到上限,導致無法寫入。
BEFORE DELETE、AFTER DELETE、BEFORE INSERT、AFTER INSERT 全部會執行,副作用不可控。
REPLACE INTO vs INSERT ... ON DUPLICATE KEY UPDATE| 特性 | REPLACE INTO | INSERT ... ON DUPLICATE KEY UPDATE |
|---|---|---|
| 主鍵值 | 改變(重新分配) | 保持不變 |
| 外鍵安全 | 破壞 | 安全 |
| 自增耗盡風險 | 高 | 無 |
| 觸發器 | DELETE + INSERT | 僅 INSERT |
| 適用場景 | 無外鍵、低頻、可接受 ID 變更 | 幾乎所有 Upsert 場景 |
INSERT ... ON DUPLICATE KEY UPDATE:保留主鍵、不觸發 DELETE 觸發器、效能更優。REPLACE,表不能有外鍵被引用,且主鍵用 BIGINT 並監控剩餘值。INSERT 與 DELETE 權限。參考來源:Martin 的技術博客