我正在尝试使用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万行?或者我是否必须进行单独更新然后提交?
答案 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)