MySQL-一次性更新记录组
假设我有一个表MySQL-一次性更新记录组,mysql,sql,Mysql,Sql,假设我有一个表users,我想将foo字段设置为“bar”(1,5,10)中id为的用户,以及(3,8,15)中id为的用户,通常我可能会有更多的值和更多的id组与每个值一起 目前(在我选择的脚本语言中)我在foo和id组的值对上循环,就像这样(伪代码) 有没有一种方法可以在单个sql命令中执行此操作,而不是在每对sql命令中执行一个命令?您可以在sql中使用case语句执行此操作。查询如下所示: update users u set foo = (case when id in (1,
users
,我想将foo
字段设置为“bar”
(1,5,10)中id为的用户,以及(3,8,15)
中id为的用户,通常我可能会有更多的值和更多的id组与每个值一起
目前(在我选择的脚本语言中)我在foo和id组的值对上循环,就像这样(伪代码)
有没有一种方法可以在单个sql命令中执行此操作,而不是在每对sql命令中执行一个命令?您可以在sql中使用case
语句执行此操作。查询如下所示:
update users u
set foo = (case when id in (1, 5, 10) then 'bar'
when id in (3, 8, 15) then 'qux'
else foo
end)
where id in (1, 5, 10) or id in (3, 8, 15);
注意:只要where
和when
语句中的列表匹配,就不需要else
。但它更安全
此外,可以将
中的列表合并为一个。但是,我认为更清楚,因为这与case
语句逻辑相匹配。使用case
选择更新值:
update users
set foo = case when id in (1,5,10) then 'bar'
when id in (3,8,15) then 'qux'
else foo end
where id in (1,5,10) or id in (3,8,15)
WHERE
子句用于降低事务大小,但不会影响更新的结果
如果您可以拥有某种组id,那么您就可以进行连接并删除in子句,特别是当id列表变大时。@草莓,它是用来降低交易量的。@jarlh好吧,我想这很公平。这很有道理——这个案例只会在我们已经知道匹配其中一个案例的记录上运行,而不是在所有记录上运行。我的桌子很大,所以这是一个重要的考虑因素。你认为箱子的数量有限制吗?例如,如果我有1000个案例,我们是否会达到这样的程度:a)查询由于某种内部限制而中断,或者b)它比只运行1000个单独的set foo='bar'where id in()
querys要慢得多?@MaxWilliams您可能会达到这样的程度:连接将被证明更有效。吮吸它看看。
update users
set foo = case when id in (1,5,10) then 'bar'
when id in (3,8,15) then 'qux'
else foo end
where id in (1,5,10) or id in (3,8,15)