sql的方式实现插入表数据一样的更新,不一样的新增

sql的方式实现插入表数据一样的更新,不一样的新增

先有个场景 user表字段有姓名(name)、年龄(age)、头像(img)

还有一个集合的数据,要将集合中数据插入表中,姓名一样的更新

不一样的新增。目前表中没设主键

  • 单条数据的实现方式这里我们先讲 sql的实现方式 基于Oracle
  merge into user a
    using
    (
      SELECT
      'xuegao'as name,
      '25' as age,
      'd://pic/1.img' as img
      FROM dual
    ) b
    on (
    a.name= b.name   <!--name一样为更新新增的筛选条件-->
    )
    when matched then
    UPDATE   SET    <!--除name外字段更新-->
    a.age= b.age,
    a.img=b.img
    when not matched then
    INSERT(        <!--全部字段新增-->
    a.name,
    a.age,
    a.img
    ) VALUES(
    b.name,
    b.age,
    b.img
  • 这里我们讲讲多条数据一样的更新不一样的插入,应该怎么写。以mybatis 传入集合的方式
<!--xml层-->
<insert id="insertData" parameterType="java.util.List">
    merge into user a
    using
    (
    <foreach collection="list" index="index" item="item" open=""
             close="" separator="union all">
        SELECT
        #{item.age,jdbcType=VARCHAR} as age,
        #{item.img,jdbcType=VARCHAR} as img,
        #{item.name,jdbcType=VARCHAR} as name
        FROM dual
    </foreach>
    ) b
    on (
    a.name= b.name
    )
    when matched then
    UPDATE SET
    a.age= b.age,
    a.img= b.img
    when not matched then
    INSERT(
    a.name,
    a.age,
    a.img
    )

</insert>

我们举例以最少的字段,具体场景在上面增加字段即可,经测验这种写法有个小问题,当集合中的数据,name如果存在重复的话,都会插入到库中

  • 当然我们也可以通过后台处理的方式解决这个问题

    这里我们讲讲逻辑,可以通过单挑循环更新的方式,在表中进行更新,若返回值为0,则将此条数据新增,若返回值为1则不进行处理,这种是我考虑到的比较简单的一种解决方式大家如果有更好的方案欢迎留言讨论

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值