mysql实现“存在即更新,不存在即插入”_mysql 搜索两个字段符合则insert不符合就updata-程序员宅基地

技术标签: 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低。

注意:在数据量较小时,两者效率大致相同,都很快,但是出现大量数据(百万级别)时,差异就显示出来了。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41941317/article/details/96478812

智能推荐

Spring(SpringBoot)--原理--@Component_component注解启动原理-程序员宅基地

文章浏览阅读1.3k次,点赞11次,收藏8次。@Component原理其他网址Spring注解Component原理源码解析 - Griez - 博客园简介 我们经常使用Spring的@Component、@Service、@Repository以及 @Controller等注解来实现bean托管给Spring容器管理。Spring是怎么样实现的呢?我们一起跟着源码看看整个过程吧!先看调用时序图:概述@Component到Spring bean容器管理过程。第一步,初始化时设置了Component类型..._component注解启动原理

TabLayout_tablayou tabgravity-程序员宅基地

文章浏览阅读202次。TabLayout是design库提供的控件,可以方便的使用指示器,功能类似ViewPagerIndicator. 使用非常方便,Android Studio只需要在gradle中引入即可使用 .?1compile'com.android.support:design:23.3.0'Ta_tablayou tabgravity

python networkx进行最短路径分析_如何利用networkx在加权图中寻找最短路径?-程序员宅基地

文章浏览阅读712次。我正在使用Python 2.7 Enthought distribution中的networkx包计算海港网络之间的最短路径。使用dijkstra_path_length计算距离是可行的,但是我还需要知道它使用dijkstra_path找到了什么路径(另外,我认为如果我先计算路径,然后计算路径的长度,而不是在同一数据上运行Dijkstra的算法两次,运行起来应该更快)。然而,path函数失败了,说..._python networkx 有向加权图最短距离

opencv获取RTMP/RTSP视频流数据 并 显示或者进行进一步处理_opencv 拉rtmp流并保存-程序员宅基地

文章浏览阅读6.7k次。临时接到这个需求,比较陌生,搜了很多资料,比如 libRTMP, rtmpdump等工具,最后发现原来 opencv的 VideoCapture 可以直接打开 RTMP视频流。但是 直接去官网下载的 dll 却不行,看了下 VideoCapture 的构造函数,第二个入参有很多可选项,其中一个是 CAP_FFMPEG, 于是 把 OpenCV重新编译了下, 带上FFMPEG选项, 这下就成功了!非常简洁!测试代码如下void rtmpTest() { string source = "rtmp:/_opencv 拉rtmp流并保存

odoo中接口开发-程序员宅基地

文章浏览阅读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服务接口

用limma包的voom方法来做RNA-seq 差异分析_limma voom-程序员宅基地

文章浏览阅读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

随便推点

git 回退代码、撤销某次merge、commit_git 取消某几笔commit的合并-程序员宅基地

文章浏览阅读1.8k次。git 回退代码、撤销某次merge、commit_git 取消某几笔commit的合并

CSP-J(入门级)2023年T2公路_csp-j公路-程序员宅基地

文章浏览阅读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. 其他情况下,每次点击价格=(下一名出价*下一名质_排名与下一名的出价有关吗

C++之入门之缺省参数&&函数重载&&引用_带参对象 and 缺省参数-程序员宅基地

文章浏览阅读913次。重新拿起曾经尚未填的C++的坑,从现在我会继续更新C++的相关内容,希望各位能够支持。_带参对象 and 缺省参数

linux查看网络状态establish,netstat命令和网络连接状态详解-程序员宅基地

文章浏览阅读4.7k次。netstat是一个查看网络连接状态的工具,在windows下也默认有这个工具(netstat -na 命令),本文主要是说Linux下的netstat工具,然后详细说明一下各种网络连接状态。1.netstat命令详解其实我常用的是 netstat -tnl | grep 443 (查看443端口是否被占用),如果有当前是root用户,我喜欢用netstat -pnl | grep 443 (还..._netstat established

关于SlidingMenu的一些改进写法,仿QQ5.0侧拉缩进_android slidemenu setbehindwidthres设置左右平分-程序员宅基地

文章浏览阅读973次。SlidingMenu的使用教程很多,如果只需要简单的侧拉,使用如下的办法简单加载点击SlidingMenu下载首先下载完毕导入项目中,导入方式如图 这时还没有玩,slidingMenu在文件夹下另一个包中,包名为library如图(点击确定)完成后开始记得看下app > build.gradle 是不是有这个项目的引用,么有就自己写,有就当这句话不存在。之后开始配置menu的初始信息privat_android slidemenu setbehindwidthres设置左右平分

推荐文章

热门文章

相关标签