Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-一次性更新记录组_Mysql_Sql - Fatal编程技术网

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)