一、语句
insert into … on conflict(column_name) do update set …
conflict(column_name): column_name字段是判断要查找的数据是否存在,作为判断条件。并且column_name必须是主键或者其他具有唯一性的字段才可。
二、案例
工具:mybatis+pgsql
一条数据sql:
insert into user(id,username,address,create_date,create_by)
values('1','刘德华','香港',now(),'system')
on conflict(id)
do update set address='中国',update_date=now(),update_by='system'
如果id=1的用户存在,那么执行更新操作。如果不存在,则插入
此案例中以字段id
为判断条件。如果传入的id=1的数据在user表中不存在,那么会insert,插入values里面指定的值。如果存在,那么更新id=1的数据,更新的字段是update后面指定的数据
批量操作:
批量操作模板
insert into table_name (column1, column2)
values
<foreach collection = "collection" separator="," item="item">
(
#{item.property1},
#{item.property2}
)
</foreach>
on conflict (column_name)
do update set column1 = #{item.property1}
案例:
dao层
void insertOrUpdateUser(@Param("depId") String depId,
@Param("operator") String operator,
@Param("userList") List<User> userList);
sql
<update id = "insertOrUpdateUser" parametertype="java.util.HashMap">
insert into user(username,address,depId,create_date,create_by)
values
<foreach collection = "userList" separator="," item="users">
(
#{users.username},
#{users.address},
#{depId},
now(),
#{operator},
)
</foreach>
on conflict(username)
do update set depId=#{depId},
update_date=now(),
update_by=#{operator}
</update>