REPLACE 與 INSERT 語法相似,關鍵不同:若新行與現有行在 PRIMARY KEY 或 UNIQUE 索引上值重複,先刪除舊行,再插入新行。
REPLACE 退化為普通 INSERT。INSERT 和 DELETE 權限。同理應用於 LOAD DATA ... REPLACE。
REPLACE 返回受影響行數 = 刪除行數 + 插入行數:
1:純插入,無刪除。>1:發生替換(如 1 刪除 + 1 插入 = 2)。REPLACE 語句指定值。INSERT)。SET col = col + 1 中右側 col 被視為 DEFAULT(col),等價於 SET col = DEFAULT(col) + 1。-- VALUES 形式 REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl [(col,...)] VALUES (...),(...),...; -- SET 形式 REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl SET col=expr, ...; -- SELECT 形式 REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl [(col,...)] SELECT ...;
| 修飾符 | 效果 |
|---|---|
LOW_PRIORITY | 降低優先級,等待無讀鎖時執行 |
DELAYED | 放入延遲隊列,立即返回客戶端(MyISAM/MEMORY 支持) |
mysql_affected_rows(conn); // 返回刪除+插入總行數
REPLACE INTO t SELECT * FROM t WHERE ...)。BEFORE DELETE、AFTER DELETE、BEFORE INSERT、AFTER INSERT 均會觸發。ON DELETE 動作影響(RESTRICT 會報錯阻止 REPLACE)。| 場景 | 推薦語句 | 理由 |
|---|---|---|
| 主鍵衝突時更新其餘列 | INSERT ... ON DUPLICATE KEY UPDATE | 不刪除行,保留自增值、外鍵關係、觸發器僅觸發 INSERT/UPDATE |
| 需完全替換行(含自增重置) | REPLACE | 語義明確:舊行不存在,新行取而代之 |
| 批量導入允許覆蓋 | LOAD DATA ... REPLACE | 高效導入並處理衝突 |