如果有一个需求:
首先要插入数据库,如果数据库已经存在 同一主键的记录,则执行 update操作,比如 修改 modifyTime时间
如果不存在就 insert 记录
平常都是先查询,存在就更新,不存在就insert 但是插入加上 insert 或者 update 不是 原子操作. 并发的时候就会有问题.
而 insert on duplicate key update 就是原子操作
update返回的操作记录数是2 insert是1
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
坑:
insert on dullicate key update的注意事项 此特性用于判断数据是插入还是更新。 但是要注意 如果update的内容没有变化,数据库返回的影响行数是1,而不是2。 因此利用此特性来解决消息幂等性时,要注意加上modify_time字段,此modif_ytime最好基于数据库函数now()来生成。不建议使用消息体的时间戳。 如果忽略此事项,容易踩大坑。
mysql官方举例:
https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html
网友评论