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低。
注意:在数据量较小时,两者效率大致相同,都很快,但是出现大量数据(百万级别)时,差异就显示出来了。
---------------------
最新文章
- InnoDB事务隔离级别
- iOS 学习 - 13.微信分享链接、QQ 分享图片
- Windows10一周年庆典壁纸
- UIButton的状态
- Oracle 分析函数 ";ORA-30485: 在窗口说明中丢失 ORDER BY 表达式";
- 老鸟的Python新手教程
- JavaScript中值类型和引用类型的区别
- 【算法系列学习】codeforces C. Mike and gcd problem
- Sudoku Generator
- HTML基础知识(表格、表单)
- How to set font and colors of Eclipse UI
- 超低质量的超低起点PYQT ------前言
- 去除web项目中的css、js缓存
- temp--贵州银行
- ****** 三十四 ******、软设笔记【存储器系统】-Cache存储器
- 51 NOd 1459 迷宫游戏 (最短路径)
- C++ 复习要点、面试常见问题总结
- SSH原理与运用(一):远程登录(转)
- WCF服务安全控制之netTcpBinding的用户名密码验证【转】
- java zxing生成二维码