如果写成
if not exists (select node_name from node_status where node_name = target_name)
insert into node_status(node_name,ip,...) values('target_name','ip',...)
else
update node_status set ip = 'ip',site = 'site',... where node_name = target_name
这样写在大多数情况下可以满足我们的需求,但是会有两个问题。
①性能带来开销,尤其是系统比较大的时候。
②在高并发的情况下会出现错误,可能需要利用事务保证安全。
所以使用on duplicate key update
insert into t_rbac_role_node(node_id,roleId,create_by,create_time,update_by,update_time ) values
<foreach collection="roleList" item="item" index="index" separator=",">
(#{nodeId},#{item.roleId},#{item.createBy},#{item.createTime},#{item.updateBy},#{item.updateTime})
</foreach>
on duplicate key update
node_id=values(node_id),role_id=values(role_id);
1:ON DUPLICATE KEY UPDATE需要有在INSERT语句中有存在主键或者唯一索引的列,并且对应的数据已经在表中才会执行更新操作。而且如果要更新的字段是主键或者唯一索引,不能和表中已有的数据重复,否则插入更新都失败。
2:不管是更新还是增加语句都不允许将主键或者唯一索引的对应字段的数据变成表中已经存在的数据。
oracle中没有此功能,oracle中使用mergeinto 实现此功能
文章参考
https:///qq_43279637/article/details/92797641