MySQL更新CASE WHEN/THEN/ELSE

nic*_*ick 76 mysql

我正在尝试使用CLI脚本更新LARGE MyISAM表(2500万条记录).该表未被其他任何东西锁定/使用.

我想而不是为每条记录做单个UPDATE查询,我不妨使用CASE功能.

id领域是主要的.我怀疑以下查询应该花费几毫秒.

UPDATE `table` SET `uid` = CASE
    WHEN id = 1 THEN 2952
    WHEN id = 2 THEN 4925
    WHEN id = 3 THEN 1592
    END
Run Code Online (Sandbox Code Playgroud)

瞧,查询占用了CPU,并没有永远完成.

然后,令我惊讶的是,我发现查询正在更新所有2500万行,在我没有指定的行上放置NULL.

那是什么意思?我是否可以在每次执行此查询时仅对特定行执行MASS更新而不更新2500万行?或者我是否必须进行单独更新然后提交?

rs.*_*rs. 153

试试这个

UPDATE `table` SET `uid` = CASE
    WHEN id = 1 THEN 2952
    WHEN id = 2 THEN 4925
    WHEN id = 3 THEN 1592
    ELSE `uid`
    END
WHERE id  in (1,2,3)
Run Code Online (Sandbox Code Playgroud)

  • 纯代码答案在 Stack Overflow 上的价值很低,因为它们对教育/授权成千上万的未来研究人员几乎没有作用。如果逻辑上无法到达,为什么还要写“ELSE”呢? (2认同)
  • @mickmackusa 无论如何添加 else 都有助于防止代码更改时发生意外,例如实现者将更改 WHERE 子句。这类似于在“return”语句之后将无法访问的“break;”添加到 switch-case 语句中。关于仅代码答案,我同意。回答者可以提供有关代码背后推理的更多详细信息。 (2认同)

小智 10

更简单的是:

UPDATE `table` SET uid = ELT(id, 2952, 4925, 1592) WHERE id IN (1,2,3)
Run Code Online (Sandbox Code Playgroud)

这只有在uid确实为1,2,3时才有效.

资料来源:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_elt


Ros*_* II 5

更简单的是:

UPDATE `table` SET uid = ELT(id, 2952, 4925, 1592) WHERE id IN (1,2,3)
Run Code Online (Sandbox Code Playgroud)


ale*_*lex 5

那是因为你错过了ELSE.

"返回第一个条件为真的结果.如果没有匹配的结果值,则返回ELSE后的结果,如果没有ELSE部分,则返回NULL." (http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#operator_case)

  • 即使我指定了一个 ELSE .. 它不会尝试更新其余部分吗?当我只需要更新3条时,我仍然不想更新2500万条记录。放置一个WHERE子句即可解决问题。 (3认同)