INSERT … ON DUPLICATE KEY UPDATE … 语句
在并发量比较高的时候,可能两个线程都查询某个记录不存在,所以会执行两次插入,然后其中一条必然会因为主键(这里说的主键不是递增主键)冲突而失败。
数据库层MySQL中INSERT … ON DUPLICATE KEY UPDATE … 就可以做这个事情,并且是原子性操作。
1、单条记录下使用:
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
如上sql假如t1表的主键或者UNIQUE 索引是a,那么当执行上面sql时候,如果数据库里面已经存在a=1的记录则更新这条记录的c字段的值为原来值+1,然后返回值为2。如果不存在则插入a=1,b=2,c=3到数据库,然后返回值为1。
2、多条记录下使用:
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(c);
MERGE INTO…语句
T有a、b两个字段 a是主键。现在有记录(100, 2)要保存到T中,T中如果已经存在则更新字段b,没有插入。
MERGE INTO T T1
USING (SELECT ‘100’ AS a, 2 AS b FROM dual) T2
ON ( T1.a = T2.a)
WHEN MATCHED THEN
UPDATE SET T1.b = T2.b
WHEN NOT MATCHED THEN
INSERT (a, b) VALUES(T2.a, T2.b);
MyBatis下使用
Mybatis作为经典的数据库持久层框架,自然要介绍下它下的使用
在mapper.xml里面配置如下:
假设a为主键
<insert id=”insertOrUpdate”>
INSERT INTO t1 (a,b,c)
values
<foreach collection=”list” item=”item” separator=”,”>
(#{item.a},#{item.b},#{item.c})
</foreach>
ON DUPLICATE KEY UPDATE c=values(c),b=values(b)
</insert>
对应的mapper接口可以定义为:
long insertOrUpdate(List<Test> list);
class Test{
private int a;
private int b;
private int c;
…
}
————————————————
版权声明:本文为CSDN博主「Rnan-prince」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_19446965/article/details/120735141