需求
我們對一條記錄進(jìn)行記錄進(jìn)行操作時,如果該條記錄存在則更新红碑,如果不存在則執(zhí)行插入操作舞吭。
實現(xiàn)方式
在MySQL中可以通過以下形式的SQL語句來操作泡垃。假設(shè)a
是t1
表中的唯一索引并且在t1
表中存在a
的值為1
的記錄,則以下兩條語句效果相同羡鸥。
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE t1 SET c=c+1 WHERE a=1;
局限性
- 以上語句會在插入時對唯一索引進(jìn)行判斷蔑穴,如果插入數(shù)據(jù)唯一索引字段值在庫中存在,則執(zhí)行更新操作惧浴,如果唯一索引字段值在庫中不存在則執(zhí)行插入操作存和。(唯一索引可以是主鍵或其他形式的聯(lián)合唯一索引)
- 上述語句中不能使用WHERE語句
滿足特定條件時執(zhí)行UPDATE
雖然不能使用WHERE條件,我們可以通過另外一種變通的方式來達(dá)到使用WHERE語句的效果-IF函數(shù)衷旅,使用方式如下捐腿。
INSERT INTO daily_events
(created_on, last_event_id, last_event_created_at)
VALUES
('2010-01-19', 23, '2010-01-19 10:23:11')
ON DUPLICATE KEY UPDATE
last_event_id = IF('condition'), VALUES(last_event_id), last_event_id),
last_event_created_at = IF('condition'), VALUES(last_event_created_at), last_event_created_at);
簡要說明:執(zhí)行UPDATE
操作時如果IF
條件滿足,則使用VALUES(last_event_id)
獲取傳入的值柿顶,否則繼續(xù)使用原來的值茄袖,不做UPDATE
操作