尝试优化 MyISAM 表上的大规模更新操作,开发人员使用了 CASE 功能。然而,查询表现出了意外的行为,影响了性能并影响了表中的所有行,甚至是 CASE 语句中未明确提及的行。
初始查询:
UPDATE `table` SET `uid` = CASE WHEN id = 1 THEN 2952 WHEN id = 2 THEN 4925 WHEN id = 3 THEN 1592 END
出乎意料的是,该查询更新了表中包含 2500 万条记录的每一行,并将所有未指定的行设置为 NULL。此行为与 CASE 语句的预期功能相矛盾,其中未提及的行应保持不变。
出现此意外结果的原因在于 CASE 语句中缺少 ELSE 子句。当行的 id 与任何指定条件都不匹配时,CASE 表达式的计算结果为 NULL。因此,MySQL 会用 NULL 更新所有行,无论它们最初是否在 CASE 语句中指定。
要纠正此问题并执行有针对性的更新,查询应包含 ELSE 子句:
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)
更新后的查询在 CASE 语句中添加了 ELSE 子句,确保所有未提及的行保留其 uid 的原始值。此外,还引入了 WHERE 子句,将更新操作限制为仅指定的 id(1、2 和 3),通过限制受影响的行来进一步提高效率。
以上是为什么我的 MySQL CASE WHEN 更新会影响所有行,如何修复?的详细内容。更多信息请关注PHP中文网其他相关文章!