MyISAM テーブルでの大規模な更新操作を最適化しようとしました。開発者は CASE 機能を採用しました。ただし、クエリは予期しない動作を示し、パフォーマンスに影響を及ぼし、CASE ステートメントで明示的に指定されていない行も含め、テーブル内のすべての行に影響を与えました。
最初のクエリ:
UPDATE `table` SET `uid` = CASE WHEN id = 1 THEN 2952 WHEN id = 2 THEN 4925 WHEN id = 3 THEN 1592 END
予期せず、このクエリは、2,500 万件のレコードを含むテーブル内のすべての行を更新し、指定されていないすべての行を NULL に設定します。この動作は、言及されていない行は変更されないままである必要がある CASE ステートメントの予期された機能と矛盾します。
この予期しない結果の理由は、CASE ステートメントに ELSE 句が存在しないことにあります。行の ID が指定された条件のいずれにも一致しない場合、CASE 式は NULL と評価されます。その結果、MySQL は、最初に CASE ステートメントで指定されたかどうかに関係なく、すべての行を NULL で更新します。
この問題を修正してターゲットを絞った更新を実行するには、クエリに 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 値を保持するようにします。さらに、更新操作を指定された ID (1、2、および 3) のみに制限するために WHERE 句が導入され、影響を受ける行を制限することで効率がさらに向上します。
以上がMySQL CASE WHEN Update がすべての行に影響するのはなぜですか? それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。