萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL REPLACE INTO 語句完整指南:語法、原理與實戰範例

什麼是 REPLACE INTO?

在 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 語句返回一個整數,表示受影響的行數總和(被刪除的行數 + 被插入的行數)。

  • 返回 1:僅插入新行,無舊行被刪除。
  • 返回 > 1:有舊行被刪除並插入新行(可能一條新行替換了多條舊行,例如多個唯一索引衝突時)。

在 C API 中可使用 mysql_affected_rows() 獲取該值。

演算法流程(含 LOAD DATA ... REPLACE)

  1. 嘗試將新行插入表中。
  2. 若因主鍵或唯一鍵重複導致插入失敗:
    • 刪除包含重複鍵值的衝突行。
    • 再次嘗試插入新行。

語法格式

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。
  • 自增列在替換時會重新生成新值(舊行被刪除,新行插入)。
copyright © 萬盛學電腦網 all rights reserved