MySQL更新CASE WHEN / THEN / ELSE

时间:2012-10-05 21:44:48

标签: mysql

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

我认为不是对每条记录执行单个UPDATE查询,我也可以使用CASE功能。

id字段为PRIMARY。我怀疑以下查询应该花费几毫秒。

UPDATE `table` SET `uid` = CASE
    WHEN id = 1 THEN 2952
    WHEN id = 2 THEN 4925
    WHEN id = 3 THEN 1592
    END

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

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

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

4 个答案:

答案 0 :(得分:138)

试试这个

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)

答案 1 :(得分:10)

  

更简单的是:

UPDATE `table` SET uid = ELT(id, 2952, 4925, 1592) WHERE id IN (1,2,3)

这只有在uid确实是1,2,3时才有效。

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

答案 2 :(得分:5)

更简单的是:

UPDATE `table` SET uid = ELT(id, 2952, 4925, 1592) WHERE id IN (1,2,3)

答案 3 :(得分:5)

那是因为你错过了ELSE。

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