mysql批量更新多条记录的同一个字段为不同值的方法批量更新多条记录的同一个字段为不同值的方法
首先首先mysql更新数据的某个字段,一般这样写:更新数据的某个字段,一般这样写:
UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';
也可以这样用in指定要更新的记录:
UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values');
这里注意这里注意 ‘other_values’ 是一个逗号(,)分隔的字符串,如:1,2,3
如果更新多条数据而且每条记录要更新的值不同,可能很多人会这样写:如果更新多条数据而且每条记录要更新的值不同,可能很多人会这样写:
foreach ($values as $id => $myvalue) {
$sql = "UPDATE mytable SET myfield = $myvalue WHERE id = $id";
mysql_query($sql);
}
即是循环一条一条的更新记录。一条记录update一次,这样性能很差,也很容易造成阻塞。
那么能不能一条sql语句实现批量更新呢?
mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。
UPDATE mytable
SET myfield = CASE id
WHEN 1 THEN 'myvalue1'
WHEN 2 THEN 'myvalue2'
WHEN 3 THEN 'myvalue3'
END
WHERE other_field ('other_values')
如果如果where条件查询出记录的条件查询出记录的id不在不在CASE范围内,范围内,myfield将被设置为空。将被设置为空。
如果更新多个值的话,只需要稍加修改:
UPDATE mytable
SET myfield1 = CASE id
WHEN 1 THEN 'myvalue11'
WHEN 2 THEN 'myvalue12'
WHEN 3 THEN 'myvalue13'
END,
myfield2 = CASE id
WHEN 1 THEN 'myvalue21'
WHEN 2 THEN 'myvalue22'
WHEN 3 THEN 'myvalue23'
END
WHERE id IN (1,2,3)
这里以php为例,构造这两条mysql语句:
1、更新多条单个字段为不同值、更新多条单个字段为不同值, mysql模式模式
$ids_values = array(
1 => 11,
2 => 22,
3 => 33,
4 => 44,
5 => 55,
6 => 66,
7 => 77,
8 => 88,
);
$ids = implode(',', array_keys($ids_values ));
$sql = "UPDATE mytable SET myfield = CASE id ";
foreach ($ids_values as $id=> $myvalue) {
$sql .= sprintf("WHEN %d THEN %d ", $id, $myvalue);
}