我们都知道MYSQL中批量插入非常大略,那么批量更新呢?
1.ININ 语句有比较大的局限性,更新后的结果必须同等。比如下面是将所有知足条件的行的状态(status)设置为1。
如果想部分设置为1,部分设置为2等,则无法实现,或者通过写多条SQL语句实现。

Update users Set status=1 Where account IN ('xx1', 'xx2');
2. For + Update
借助 For 循环 + Update 语句,即逐一更新,优点是清晰直不雅观,适用于大部分情形,不易出错。缺陷是性能较差,随意马虎造成堵塞。
如果是在MYSQL客户端实行,这种方法很未便利。一样平常须要天生多条Update语句,或者可以用存储过程实现。
3. Insert into…on duplicate key update利用主键(或唯一键)的唯一性进行更新的好处是支持批量更新,更新结果不须要保持同等。缺陷是一样平常第三方库不支持这种语法,须要写原生SQL,所有字段必须有默认值(包括NULL)。
create table users( id int(11) PRIMARY KEY AUTO_INCREMENT, name varchar(255) NOT NUll DEFAULT '', age smallint, job varchar(255));INSERT INTO go_business.users (id, name, age, job) VALUES (1, 'name1', 1, 'job1');INSERT INTO go_business.users (id, name, age, job) VALUES (2, 'namw2', 2, 'job2');INSERT INTO go_business.users (id, name, age, job) VALUES (3, 'name3', 3, 'job3');INSERT INTO go_business.users (id, name, age, job) VALUES (4, 'name4', 4, 'job4');INSERT INTO go_business.users (id, name, age, job) VALUES (5, 'name5', 5, 'job5');mysql> insert into users (id, job, age) values (1, 'job11', 11),(2, 'job22', 22) on duplicate key update job=values(job), age=values(age);mysql> select from users where id in (1, 2);+----+-------+------+-------+| id | name | age | job |+----+-------+------+-------+| 1 | name1 | 11 | job11 || 2 | namw2 | 22 | job22 |+----+-------+------+-------+
4. Replace into
众所周知,它是一个更换,相称于一个 update。语法类似于第三种方法,但比第三种方法更危险,由于更新时如果字段不完全,未覆盖的字段将被设置为默认值。
replace into users(id, job, age) VALUES (1, 'job111', 111),(2, 'job222', 222);mysql> select from users where id in (1, 2);+----+------+------+--------+| id | name | age | job |+----+------+------+--------+| 1 | | 111 | job111 || 2 | | 222 | job222 |+----+------+------+--------+2 rows in set (0.00 sec)
缘故原由是 replace into 操作的实质是先删除重复记录再插入,以是如果更新的字段不完全,缺失落的字段会被设置为默认值,而 insert into 只是更新重复记录,不会改变其他字段。
5. Set…case…when…where优点:可以批量更新,也支持更新多个字段,更新多个结果。缺陷:语句较长,实现起来比较麻烦,也比较随意马虎出错。常日它是通过主键或唯一键更新的。
update users set job = case id when 1 then 'job11' when 2 then 'job12' end, age = case id when 1 then 11 when 2 then 12 endwhere id IN (1, 2);mysql> select from users where id in (1, 2);+----+-------+------+-------+| id | name | age | job |+----+-------+------+-------+| 1 | name1 | 11 | job11 || 2 | name2 | 12 | job12 |+----+-------+------+-------+
一样平常这种办法也比较随意马虎出错,紧张有两种:
update users set job = case id when 1 then 'job11' when 3 then 'job13' end, age = case id when 1 then 11 when 2 then 12 endwhere id IN (1, 2);select from users where id in (1, 2);+----+-------+------+-------+| id | name | age | job |+----+-------+------+-------+| 1 | name1 | 11 | job11 || 2 | name2 | 12 | NULL |+----+-------+------+-------+update users set job = case id when 1 then 'job11' when 2 then 'job12' end, age = case id when 1 then 11 when 2 then 12 end;select from users;+----+-------+------+-------+| id | name | age | job |+----+-------+------+-------+| 1 | name1 | 11 | job11 || 2 | name2 | 12 | job12 || 3 | name3 | NULL | NULL || 4 | name4 | NULL | NULL || 5 | name5 | NULL | NULL |+----+-------+------+-------+
通过上面的测试,我们可以看出这种操作办法是相称危险的。一欠妥心,字段就会更新为默认值,以是利用的时候一定要非常小心,一定不能漏掉Where子句。
6.创建临时表临时表的办法是更换另一个表的数据,但是一样平常情形下我们是没有创建表的权限的,以是这个想法可能不太现实。
create temporary table users_tmp( id int(11) PRIMARY KEY AUTO_INCREMENT, age smallint, job varchar(255));insert into users_tmp(id, job, age) values (1, 'job11', 11), (2, 'job22', 22);update users, users_tmp set users.job=users_tmp.job, users.age=users_tmp.age where users.id=users_tmp.id;
如果你有更多方法,请留言。