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则不进行处理,这种是我考虑到的比较简单的一种解决方式大家如果有更好的方案欢迎留言讨论