需求
我们对一条记录进行记录进行操作时,如果该条记录存在则更新,如果不存在则执行插入操作。
实现方式
在MySQL中可以通过以下形式的SQL语句来操作。假设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;
局限性
- 以上语句会在插入时对唯一索引进行判断,如果插入数据唯一索引字段值在库中存在,则执行更新操作,如果唯一索引字段值在库中不存在则执行插入操作。(唯一索引可以是主键或其他形式的联合唯一索引)
- 上述语句中不能使用WHERE语句
满足特定条件时执行UPDATE
虽然不能使用WHERE条件,我们可以通过另外一种变通的方式来达到使用WHERE语句的效果-IF函数,使用方式如下。
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);
简要说明:执行UPDATE
操作时如果IF
条件满足,则使用VALUES(last_event_id)
获取传入的值,否则继续使用原来的值,不做UPDATE
操作
参考
insert-on-duplicate
conditional-duplicate-key-updates-with-mysql