ホームページ > データベース > mysql チュートリアル > MySQL CASE WHEN Update がすべての行に影響するのはなぜですか? それを修正するにはどうすればよいですか?

MySQL CASE WHEN Update がすべての行に影響するのはなぜですか? それを修正するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-03 08:12:14
オリジナル
584 人が閲覧しました

Why Does My MySQL CASE WHEN Update Affect All Rows, and How Can I Fix It?

CASE WHEN/THEN/ELSE を使用した MySQL 更新: 予期しない結果と洗練された解決策

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート