MYSQL主键存在则更新,不存在则插入的解决方案(ON DUPLICATE KEY UPDATE)
经常我们使用的最简单的数据库操作就是数据的更新,删除和插入,对于批量删除和插入的方法相信大家都很清楚,那么批量更新估计有的人就不知道了,并且还有批量插入,在插入时若有主键冲突则更新的操作,这在EAV模式中应该会经常用到吧。
曾在网上搜索相关资料,有介绍三种方法:
第一种是插入时通过where条件查询该条记录是否已经存在,就这么完了,话说这根本就没有解决问题好吧!!!
第三种是使用REPLACE语句,该语句使用很简单,就是将INSERT INTO语句中的INSERT改为REPLACE就行,其他写法照旧,该条语句可以在索引或主键有冲突的情况下,删除已存在的记录,然后插入新记录。确实是达到我想要的功能了,只是觉得先删除再插入,真麻烦,虽然不需要我来操作。
咦,第二种呢?来了,我比较推荐第二种做法,使用ON DUPLICATE KEY UPDATE,这个的作用是在索引或主键冲突的情况下更新语句,否则就插入。下面举例说:
若表table的a字段为索引或主键,那执行下面语句:
1
|
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1; |
如果a为1的这条记录不存在,那么就正常插入,若已存在,那么就更新操作将c字段加1.
您可以在UPDATE子句中使用VALUES(col_name)函数从INSERT…UPDATE语句的INSERT部分引用列值。换句话说,如果没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函数特别适用于多行插入。VALUES()函数只在INSERT…UPDATE语句中有意义,其它时候会返回NULL。
1
|
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c= VALUES (a)+ VALUES (b); |
这条语句相当于执行了以下两条语句
1
2
|
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=3; INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=9; |
综上所述,个人还是喜欢ON DUPLICATE KEY UPDATE这种做法的。