在MySQL中如何实现一条SQL语句实现批量更新,MySQL没有提供直接的方法实现批量更新,但我们可以通过一些小技巧来实现
假设有一张雇员表
create table emp(
id int primary key auto_increment, /*编号*/
name varchar(60) not null,/*姓名*/
sex varchar(30) not null,/*性别*/
salary int(8) not null/*薪水*/
);
添加几条数据
insert into emp values(1,"刘一","女",5000);
insert into emp values(2,"陈二","女",6000);
insert into emp values(3,"张三","男",8000);
insert into emp values(4,"李四","男",8000);
insert into emp values(5,"王五","男",7000);
现在要给他们涨薪水,已知每个人的编号,女生每人涨300,男生每人涨五百
这里使用case when这个小技巧来实现批量更新,语法为:
UPDATE mytable SET
myfield = CASE id
WHEN 1 THEN 'value1'
WHEN 2 THEN 'value2'
WHEN 3 THEN 'value3'
END
WHERE id IN (1,2,3);
上面语句大概意思是,更新mytable表的myfield字段,如果id=1则myfield的值为value1,如果id=2则myfield的值为value2,如果id=3则myfield的值为value3
这里的where部分不影响代码的执行,但是会提高sql执行的效率。
确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。
如果更新多个值的话,只需要稍加修改:
UPDATE mytable SET
myfield1 = CASE id
WHEN 1 THEN 'value1'
WHEN 2 THEN 'value2'
WHEN 3 THEN 'value3'
END,
myfield2 = CASE id
WHEN 1 THEN 'value4'
WHEN 2 THEN 'value5'
WHEN 3 THEN 'value6'
END
WHERE id IN (1,2,3);
由此便可写出上文需求的SQL语句了
update emp set
salary = case id
when 1 then 5300
when 2 then 6300
when 3 then 8500
when 4 then 8500
when 5 then 7500
end
where id in (1,2,3,4,5);
到这里,已经完成一条mysql语句更新多条记录了。但是要在业务中运用,需要结合服务端语言,这里以php为例,构造这条mysql语句,代码如下:
$display_order = array(
1 => 4,
2 => 1,
3 => 2,
4 => 3,
5 => 9,
6 => 5,
7 => 8,
8 => 9
);
$ids = implode(',', array_keys($display_order));
$sql = "UPDATE categories SET display_order = CASE id ";
foreach ($display_order as $id => $ordinal) {
$sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal);
}
$sql .= "END WHERE id IN ($ids)";
echo $sql;
上一篇:MySQL表的设计
下一篇:MySQL的若干实用函数