在 MySQL 中,REPLACE INTO 是一條功能強大的 SQL 語句,它結合了 INSERT 和 DELETE 的行為。許多開發者較少使用它,但其實它在處理「主鍵或唯一索引衝突」的場景下,比單獨使用 UPDATE 或 INSERT 更高效、更簡潔。
根據 MySQL 官方手冊,REPLACE 的運行機制與 INSERT 非常相似,只有一個關鍵差異:
如果表中已存在的舊記錄,其 主鍵 或 唯一索引 的值與新記錄相同,則在插入新記錄之前,舊記錄會被先刪除。
這意味著 REPLACE INTO 實際上執行了「刪除舊行 → 插入新行」的兩步操作。因此,要使用該語句,用戶必須同時擁有該表的 INSERT 和 DELETE 權限。
注意: 除非表定義了 PRIMARY KEY 或 UNIQUE 索引,否則 REPLACE INTO 與普通 INSERT 無異,因為無法判斷「重複」。
REPLACE 語句中指定的值。INSERT)。SET col = col + 1 中的右側 col 會被視為 DEFAULT(col))。REPLACE 語句返回一個整數,表示受影響的行數總和(被刪除的行數 + 被插入的行數)。
在 C API 中可使用 mysql_affected_rows() 獲取該值。
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
VALUES ({expr | DEFAULT},...),(...),...
-- 或使用 SET 子句
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name
SET col_name={expr | DEFAULT}, ...
-- 或從查詢結果插入
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
SELECT ...
SELECT 判斷再決定 INSERT 或 UPDATE 的往返開銷。REPLACE 和 SELECT。BEFORE DELETE、AFTER DELETE、BEFORE INSERT、AFTER INSERT。