数据库批量插入,存在则更新,不存在则插入

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;
...
}

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值