REPLACE 語句的運作機制與 INSERT 非常相似,但有一個關鍵差異:當表中已存在的記錄與新記錄在 PRIMARY KEY 或 UNIQUE 索引 上具有相同值時,舊記錄會在新記錄插入前被刪除。這使得 REPLACE 成為「不存在則插入,存在則更新」的便捷工具。
除非表擁有 PRIMARY KEY 或 UNIQUE 索引,否則使用 REPLACE 語句毫無意義——它將表現得與 INSERT 完全一致,因為沒有索引可用於判斷新行是否複製了其他行。
SET col_name = col_name + 1 這類賦值,右側列名會被視為 DEFAULT(col_name),等價於 SET col_name = DEFAULT(col_name) + 1使用 REPLACE 需同時具備表的 INSERT 和 DELETE 權限。
REPLACE 返回一個數字,表示受影響行數(被刪除行數 + 被插入行數):
在 C API 中可用 mysql_affected_rows() 獲取此值。
目前不支持在子查詢中向同一表替換數據的同時從該表選擇數據。
此算法亦用於 LOAD DATA ... REPLACE。
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
VALUES ({expr | DEFAULT},...),(...),...
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name
SET col_name={expr | DEFAULT}, ...
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
SELECT ...