REPLACE INTO 在主鍵或唯一索引衝突時,會先刪除舊行再插入新行。這意味著:
DELETE 與 INSERT 觸發器AUTO_INCREMENT 值可能重置ON DELETE CASCADE 會連帶刪除子表資料-- 形式一:VALUES 列表
REPLACE [LOW_PRIORITY | DELAYED] INTO tbl_name [(col_list)] VALUES (val_list),...;
-- 形式二:SET 子句
REPLACE [LOW_PRIORITY | DELAYED] INTO tbl_name SET col=val, ...;
-- 形式三:SELECT 查詢
REPLACE [LOW_PRIORITY | DELAYED] INTO tbl_name [(col_list)] SELECT ...;
執行需同時具備 INSERT 與 DELETE 權限。回傳受影響行數 = 刪除行數 + 插入行數:
1:單純新增>1:有舊資料被取代(可能一行取代多行)| 場景 | 建議 |
|---|---|
| 高併發寫入 | 避免使用,鎖競爭劇烈;改用 INSERT ... ON DUPLICATE KEY UPDATE |
| 批次匯入去重 | 評估 LOAD DATA ... REPLACE 或臨時表 + INSERT IGNORE |
| 需保留 AUTO_INCREMENT | 必須用 ON DUPLICATE KEY UPDATE |
-- 推薦:明確指定欄位,避免隱性 DEFAULT 值陷阱
REPLACE INTO users (id, email, name, updated_at)
VALUES (101, 'new@example.com', '新用戶', NOW());