REPLACE = INSERT + 衝突時 DELETE 舊行 + INSERT 新行。
前提:表必須有 PRIMARY KEY 或 UNIQUE 索引,否則退化為普通 INSERT (無衝突檢測)。
-- 1. VALUES 列表
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_list)]
VALUES (val_list), (val_list), ...;
-- 2. SET 形式
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name
SET col_name = val, ...;
-- 3. SELECT 來源
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_list)]
SELECT ...;
需同時擁有表的 INSERT 權限 + DELETE 權限 (因內部執行刪除舊行)。
REPLACE 語句指定值。DEFAULT 值 (同 INSERT)。SET col = col + 1 中右側 col 被視為 DEFAULT(col),等效 SET col = DEFAULT(col) + 1。| 回傳值 | 含義 | 內部操作 |
|---|---|---|
| 1 | 純插入 1 行 | INSERT |
| 2 | 刪 1 行 + 插 1 行 | DELETE + INSERT |
| >2 | 刪多行 (多唯一索引衝突) + 插 1 行 | 多 DELETE + INSERT |
判斷邏輯:
affected_rows == 1 → 新增
affected_rows > 1 → 替換 (含更新)
mysql_affected_rows(conn); -- 返回上述語義值
REPLACE 並 SELECT。BEFORE DELETE、AFTER DELETE、BEFORE INSERT、AFTER INSERT 四類觸發器。ON DELETE CASCADE 會級聯刪除子表行;若引用他表 (子表),需滿足外鍵約束。DELAYED 在 5.6+ 棄用,8.0 移除。INSERT 新行。ER_DUP_KEY):DELETE 衝突行 (所有衝突唯一索引對應的行)。INSERT 新行 (此時必成功)。| 特性 | REPLACE | INSERT ... ON DUPLICATE KEY UPDATE |
|---|---|---|
| 衝突處理 | 刪舊插新 | 就地更新 |
| 自增 ID | 變更 (新 ID) | 保持不變 |
| 未指定列 | 重置為 DEFAULT | 保持舊值 (除非顯式 UPDATE) |
| 觸發器 | DELETE + INSERT 觸發器 | UPDATE 觸發器 |
| 效能 | 較慢 (雙操作) | 較快 (單操作) |
| 適用場景 | 需完全替換、重置 DEFAULT | 部分欄位更新、保留其它舊值 |
INSERT ... ON DUPLICATE KEY UPDATE 實現 UPSERT,效能更好、語義更精準。REPLACE。REPLACE (可能刪除多行非預期數據)。affected_rows 區分新增/更新,用於日誌/統計/緩存失效。