有的时候会需要写一段insert的sql,如果主键存在,则update;如果主键不存在,则insert。Mysql中提供了这样的用法:
ON DUPLICATE KEY UPDATE
。下面就看看它是如何使用的吧!
首先数据库的原始数据如下:
a b c1 b1 c12 b2 c23 b3 c3
此时如果执行下面的sql就会报错
INSERT INTO test VALUES(1,'b4','c4');
报错信息如下,提示无法重复插入:
1 queries executed, 0 success, 1 errors, 0 warnings查询:insert into test values(1,'b4','c4') 错误代码: 1062 Duplicate entry '1' for key 'PRIMARY' 执行耗时 : 0 sec 传送时间 : 0 sec 总耗时 : 0.008 sec
这时,就可以使用ON DUPLICATE KEY UPDATE
,它的意思是先执行前面的Insert,如果主键重复,则执行后面的UPDATE
INSERT INTO test VALUES (1,'b4','c4') ON DUPLICATE KEY UPDATE b=VALUES(b),c=VALUES(c);
可以把上面的SQL简单的理解为:
select count(1) from test where a=1; if count(1) > 0 UPDATE test SET b='xxx',c='xxx' WHERE a=1;
执行完,可以看到有两行收到影响(至于为什么两行收到影响,就得研究底层的实现了,可以参考):
1 queries executed, 1 success, 0 errors, 0 warnings查询:INSERT INTO test VALUES (1,'b4','c4') ON DUPLICATE KEY UPDATE b=VALUES(b),c=VALUES(c) 共 2 行受到影响 执行耗时 : 0.023 sec 传送时间 : 0 sec 总耗时 : 0.023 sec
执行完,数据就变成下面的样子了:
a b c1 b4 c42 b2 c23 b3 c3