Mysql中INSERT ... ON DUPLICATE KEY UPDATE的实践

参考:Mysql中INSERT … ON DUPLICATE KEY UPDATE的实践:https://www.jianshu.com/p/78ea17c6d190



一、前言

在日常业务开发中经常有这样一个场景,如果数据库已经存在同一主键的记录,则执行update操作,如果不存在,则执行insert操作。

【注意】 这里的同一主键的记录,这个主键不是指的 递增主键,而是我们 在数据库表中定义的 unique 主键(唯一索引)。

这个操作可以在业务层做,也可以在数据库层面做:

  • 业务层一般做法是先查询,如果不存在在插入,如果存在则更新,但是查询和插入不是原子性操作,在并发量比较高的时候,可能两个线程都查询某个记录不存在,所以会执行两次插入,然后其中一条必然会因为主键(这里说的主键不是递增主键,而是唯一主键)冲突而失败。可以添加事务控制解决。

  • 数据库层mysql中 INSERT ... ON DUPLICATE KEY UPDATE 就可以做这个事情,并且是原子性操作

二、INSERT … ON DUPLICATE KEY UPDATE命令 使用

2.1 更新/插入多记录下使用

如下sql中,假如t1表的主键 或者 UNIQUE索引 是a ,那么当执行上面sql时候,如果数据库里面已经存在a=1的记录则更新这条记录的c字段的值为原来值+1,然后返回值为2。如果不存在则插入a=1,b=2,c=3到数据库,然后返回值为1。

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(c);

2.2 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>

三、总结

1:ON DUPLICATE KEY UPDATE 功能生效的前提是: INSERT插入的字段列中,需要存在 主键 或者 唯一索引的列 (存在其中一个即可)。

  • 表中存在主键值 对应的记录 会执行更新操作。
  • 表中不存在主键值 对应的记录 会执行插入操作。如果要更新的字段是主键或者唯一索引,不能和表中已有的数据重复,否则插入更新都失败。

2:不管是更新还是增加语句都不允许将主键或者唯一索引的对应字段的数据变成表中已经存在的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值