mysql批量更新数据List<Map<>>

一、前言

最近因为业务需求需要对数据库进行数据批量更新,常规的sql更新语句:UPDATE tableName SET columnName = value WHERE columnName = value;一次只能更新一条数据,不能达到批量操作的需求。

在业务层一般做法是利用for循环依次单个插入,需要多次访问数据库更新语句,消耗资源的同时也容易引发事务的问题。

网上查了下资料,有以下两种方式容易实现(借用批量插入达到更更新):

  • replace into
  • INSERT ... ON DUPLICATE KEY UPDATE

1.replace into

REPLACE INTO demo(title,uid) VALUES ('1234657','1003');

replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中, 1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。 2. 否则,直接插入新数据。

批量操作:
replace into demo(id,dr) values (1,'2'),(2,'3'),...(x,'y');

只有当更新所有字段时采用此方法,如果更新的字段不全会将缺失的字段置为缺省值,用这个要悠着点否容易清空大量数据。

2.INSERT ... ON DUPLICATE KEY UPDATE

INSERT INTO demo(a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=4;

想对于replace into来说,这种方式只更新后端提供的数据,不会改变其它字段。

批量操作:
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(c);
mybatis下使用
<insert id="insertOrUpdate">
        INSERT INTO t1 (a,b,c) 
        values
        <foreach collection="list" item="item"  separator=",">
            (#{item.a},#{item.b},#{item.c})
        </foreach>
        ON DUPLICATE KEY UPDATE c=values(c),b=values(b)
 </insert>

注:update 后的不是条件,而且实际需要更新的字段

参考:https://www.jianshu.com/p/78ea17c6d190
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 作者:烨竹 数据库的基本操作 登陆MySQL数据库服务:mysql -h服务器地址 -P端口号 -u用户名 ...
    DragonRat阅读 1,396评论 0 7
  • ORACLE自学教程 --create tabletestone ( id number, --序号usernam...
    落叶寂聊阅读 1,147评论 0 0
  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,857评论 5 116
  • 1.高并发优化点有: 如果请求过多,判定web服务器的压力过大,增加前端的web服务器,做负载均衡 如果请求静态界...
    Aimerwhy阅读 580评论 0 0
  • 坚持目标【读书】分享第803天2019.4.11今天在市心协进行了公益沙龙分享,得到了领导和老师的好评,心里美滋滋...
    坚定目标阅读 218评论 0 1