一、前言
最近因为业务需求需要对数据库进行数据批量更新,常规的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 后的不是条件,而且实际需要更新的字段