MySQL实现存在更新不存在插入on duplicate key update

如果写成

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://blog.csdn.net/qq_43279637/article/details/92797641

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章