資料寫入常見需求:「不存在則插入,存在則更新」。MySQL 提供 REPLACE INTO 單指令完成此邏輯,比傳統 SELECT → IF → INSERT/UPDATE 更簡潔高效。
關鍵前提: 表必須有主鍵或唯一索引,否則 REPLACE INTO 等同 INSERT,導致重複資料。
-- 1. VALUES 形式
REPLACE INTO table (id, update_time) VALUES (1, NOW());
-- 2. SELECT 形式
REPLACE INTO table (id, update_time) SELECT 1, NOW();
-- 3. SET 形式
REPLACE INTO table SET id=1, update_time=NOW();
INTO 關鍵字可省略,但建議保留以提升可讀性。未指定的欄位會自動填入預設值。
| 特性 | REPLACE INTO | INSERT ... ON DUPLICATE KEY UPDATE |
|---|---|---|
| 底層行為 | 刪除舊列 + 插入新列 | 原地更新 |
| 自增 ID | 可能改變(刪除重插) | 保持不變 |
| 外鍵關聯 | 觸發 ON DELETE/INSERT | 不觸發 |
| 引用舊值運算 | 不支援(如 col=col+1) | 支援 VALUES(col) 參考插入值 |
| 觸發器 | DELETE + INSERT 觸發器 | UPDATE 觸發器 |
-- 需要在原值基礎上運算,REPLACE INTO 無法直接達成
REPLACE INTO table SET col = col + 1, id = 1; -- 錯誤/不生效
此類「增量更新」必須改用:
INSERT INTO table (id, col) VALUES (1, 1)
ON DUPLICATE KEY UPDATE col = col + 1;
REPLACE INTO。INSERT ... ON DUPLICATE KEY UPDATE。REPLACE INTO 因刪除+插入雙重操作,效能較差;考慮分批 INSERT IGNORE + 後續更新。REPLACE INTO 是「更新」,實則是「刪除後插入」。REPLACE INTO 做增量計數,導致邏輯錯誤。掌握兩者差異,根據業務語義選擇正確的 Upsert 策略,能避免資料不一致與效能陷阱。