mysql實現“存在即更新,不存在即插入”


方法1:使用replace關鍵字

replace是insert的增強版,可以實現插入的數據和已存在的數據發生主鍵或者唯一鍵重復,則刪除已存在的數據,再實現插入,如果不重復,則直接插入數據。

結合Mybatis批量處理,用法如下:

<update id="updateSchoolTable" useGeneratedKeys="true" parameterType="java.util.List">
<!-- 存在則更新,不存在則插入 -->
replace into
schoolTable(Id,describeDataForm,childrenID,relevanceID,showType)
values
<foreach collection="list" item="schoolDataForm" separator=",">
(
#{schoolDataForm.Id},
#{schoolDataForm.describeDataForm},
#{schoolDataForm.childrenID},
#{schoolDataForm.relevanceID},
#{schoolDataForm.showType}
)
</foreach>
</update>
方法2:使用ON DUPLICATE KEY UPDATE

該方法能夠在主鍵或者唯一鍵重復時,修改原記錄中某字段的數據。

結合Mybatis批量處理,用法如下:

<update id="updateSchoolTable" useGeneratedKeys="true" parameterType="java.util.List">
insert into
schoolTable(Id,describeDataForm,childrenID,relevanceID,showType)
values
<foreach collection="list" item="schoolDataForm" separator=",">
(
#{schoolDataForm.Id},
#{schoolDataForm.describeDataForm},
#{schoolDataForm.childrenID},
#{schoolDataForm.relevanceID},
#{schoolDataForm.showType}
)
</foreach>

<!--存在即可修改下述字段的數據,注意values()中的內容是數據表中相應的字段名-->
ON DUPLICATE KEY UPDATE
describeDataForm=values(describeDataForm),
childrenID=values(childrenID),
relevanceID=values(relevanceID),
showType=values(showType)
</update>
性能區別:

正如replace底層實現所示,如果主鍵重復會先刪除數據庫中原來的記錄,插入新紀錄。但是數據庫刪除操作需要維護主鍵索引,這無疑需要消耗性能。

ON DUPLICATE KET QPDATE只是在主鍵重復時修改所需字段的值,所以不影響主鍵。維護成本自然相對於replace低。

注意:在數據量較小時,兩者效率大致相同,都很快,但是出現大量數據(百萬級別)時,差異就顯示出來了。

 
---------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM