當 INSERT 語句尾部加上 ON DUPLICATE KEY UPDATE,若插入導致唯一索引或主鍵衝突,則執行 UPDATE;否則插入新行。
INSERT INTO `table` (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
等效於:
UPDATE `table` SET c=c+1 WHERE a=1;
影響行數:插入新行返回 1,更新現有行返回 2。
單條 INSERT 只能有一個 ON DUPLICATE KEY UPDATE 子句,但可一次插入多行。關鍵在於使用 VALUES(欄位名) 引用「當前插入行」的值:
INSERT INTO `table` (a,b,c) VALUES
(1,2,3),
(2,5,7),
(3,3,6),
(4,8,2)
ON DUPLICATE KEY UPDATE b=VALUES(b);
假設表中已存在 (2,2,9) 和 (3,2,1)(a 為唯一鍵):
(1,2,3):a=1 無衝突 → 插入新行(2,5,7):a=2 衝突 → 更新 b=VALUES(b)=5,原行變 (2,5,9)(3,3,6):a=3 衝突 → 更新 b=VALUES(b)=3,原行變 (3,3,1)(4,8,2):a=4 無衝突 → 插入新行最終結果:新增 (1,2,3)、(4,8,2);更新 (2,5,9)、(3,3,1)。
ON DUPLICATE KEY UPDATE 是 MySQL 專有語法,非 SQL 標準。VALUES() 僅能在 ON DUPLICATE KEY UPDATE 子句中使用,不可用於其他位置。ON DUPLICATE KEY UPDATE b=VALUES(b), c=VALUES(c)。