我们都知道在MySQL中批量insert的速度会比一条条insert快很多。类似的,update也应该是如此,但因为update的值往往因为条件的不同而不同,只能分开做。
但是在下面的情况下,批量的update是可以做到的。
1. 查询的条件中有主键或唯一键
2. 查询的条件是等于,而不是范围。这实际上包含了1的情况
在1的情况下,可以使用
replace 或者 insert into ... values ... on duplicate key update ...
两者都是在键重复的情况下自动的做更新,但需要注意的是,键不存在的时候会做insert操作。
在2的情况下,可以建一张临时表,把要更新的值插入临时表,然后和需要更新的表连接做update
如:
+-------------+------------------+------+-----+-------------------+ | Field | Type | Null | Key | Default | +-------------+------------------+------+-----+-------------------+ | id | int(11) | NO | PRI | NULL | | name | varchar(30) | YES | | NULL | | email | varchar(40) | YES | | NULL | | address | varchar(50) | YES | | NULL | | age | int(10) unsigned | YES | | NULL | | regist_time | timestamp | NO | | CURRENT_TIMESTAMP | +-------------+------------------+------+-----+-------------------+
要按照id更新name
两种方法分别为
insert into user (id,name) values (?,?),(?,?) on duplicate key update name = values(name)
create temporary table tmp (id int primary key, n varchar(20)); insert into tmp values (?,?),(?,?); update user, tmp set user.name = tmp.n where user.id = tmp.id;
这样当user的数据量是10万,更新2万的时候,包括必要的程序时间,一条条更新需要1.7秒,方法1需要0.30秒,方法2需要0.26秒。