如果寫成
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