技术标签: 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低。
注意:在数据量较小时,两者效率大致相同,都很快,但是出现大量数据(百万级别)时,差异就显示出来了。
文章浏览阅读1.3k次,点赞11次,收藏8次。@Component原理其他网址Spring注解Component原理源码解析 - Griez - 博客园简介 我们经常使用Spring的@Component、@Service、@Repository以及 @Controller等注解来实现bean托管给Spring容器管理。Spring是怎么样实现的呢?我们一起跟着源码看看整个过程吧!先看调用时序图:概述@Component到Spring bean容器管理过程。第一步,初始化时设置了Component类型..._component注解启动原理
文章浏览阅读202次。TabLayout是design库提供的控件,可以方便的使用指示器,功能类似ViewPagerIndicator. 使用非常方便,Android Studio只需要在gradle中引入即可使用 .?1compile'com.android.support:design:23.3.0'Ta_tablayou tabgravity
文章浏览阅读712次。我正在使用Python 2.7 Enthought distribution中的networkx包计算海港网络之间的最短路径。使用dijkstra_path_length计算距离是可行的,但是我还需要知道它使用dijkstra_path找到了什么路径(另外,我认为如果我先计算路径,然后计算路径的长度,而不是在同一数据上运行Dijkstra的算法两次,运行起来应该更快)。然而,path函数失败了,说..._python networkx 有向加权图最短距离
文章浏览阅读6.7k次。临时接到这个需求,比较陌生,搜了很多资料,比如 libRTMP, rtmpdump等工具,最后发现原来 opencv的 VideoCapture 可以直接打开 RTMP视频流。但是 直接去官网下载的 dll 却不行,看了下 VideoCapture 的构造函数,第二个入参有很多可选项,其中一个是 CAP_FFMPEG, 于是 把 OpenCV重新编译了下, 带上FFMPEG选项, 这下就成功了!非常简洁!测试代码如下void rtmpTest() { string source = "rtmp:/_opencv 拉rtmp流并保存
文章浏览阅读1.4k次。文章参考:https://blog.csdn.net/qq_33472765/article/details/81913627案例0000001接口调用请求说明:https请求方式:GET(请使用https协议)csrf=Falsecsrf(Cross-site request forgery跨站请求伪造)问题,get请求不影响,post就需要csrf认证CSRF(跨站请求伪造) ..._odoo 开发restful服务接口
文章浏览阅读3k次,点赞3次,收藏17次。用limma包的voom方法来做RNA-seq 差异分析大家都知道,这十几年来最流行的差异分析软件就是R的limma包了,但是它以前只支持microarray的表达数据。考虑到大家都熟悉了它,它又发了一个voom的方法,让它从此支持RNA-seq的count数据啦!大家都知道芯片数据跟RNA-seq数据的本质就是value的分布不一样,所以各种针对RNA-seq的差异分析包也就是提出来一个新的normalization方法而已。而我们limma本身就提出了一个voom的方法来对RNA-seq数据进行_limma voom
文章浏览阅读1.8k次。git 回退代码、撤销某次merge、commit_git 取消某几笔commit的合并
文章浏览阅读1.2k次,点赞4次,收藏8次。小苞准备开着车沿着公路自驾。公路上一共有n个站点,编号为从1到n。其中站点i与站点i1的距离为vi公里。公路上每个站点都可以加油,编号为i的站点一升油的价格为ai元,且每个站点只出售整数升的油。小苞想从站点1开车到站点n,一开始小苞在站点1且车的油箱是空的。已知车的油箱足够大,可以装下任意多的油,且每升油可以让车前进d公里。问小苞从站点1开到站点n,至少要花多少钱加油?_csp-j公路
文章浏览阅读1.2k次。点击价格与关键词出价是不一样的,这是由于搜索引擎在使用自动点击计费来帮推广商户节省费用,仅比您下面一名多出一分钱。也就是说,商户自身应付的点击价格与自己的出价并无直接联系,而与下一名的出价相关。 具体计算时有2种情况 1. 关键词排在所有推广结果的最后一名,或是唯一一个可以展现的推广结果,则点击价格为该关键词的最低展现价格。 2. 其他情况下,每次点击价格=(下一名出价*下一名质_排名与下一名的出价有关吗
文章浏览阅读913次。重新拿起曾经尚未填的C++的坑,从现在我会继续更新C++的相关内容,希望各位能够支持。_带参对象 and 缺省参数
文章浏览阅读4.7k次。netstat是一个查看网络连接状态的工具,在windows下也默认有这个工具(netstat -na 命令),本文主要是说Linux下的netstat工具,然后详细说明一下各种网络连接状态。1.netstat命令详解其实我常用的是 netstat -tnl | grep 443 (查看443端口是否被占用),如果有当前是root用户,我喜欢用netstat -pnl | grep 443 (还..._netstat established
文章浏览阅读973次。SlidingMenu的使用教程很多,如果只需要简单的侧拉,使用如下的办法简单加载点击SlidingMenu下载首先下载完毕导入项目中,导入方式如图 这时还没有玩,slidingMenu在文件夹下另一个包中,包名为library如图(点击确定)完成后开始记得看下app > build.gradle 是不是有这个项目的引用,么有就自己写,有就当这句话不存在。之后开始配置menu的初始信息privat_android slidemenu setbehindwidthres设置左右平分