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

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