ホームページ > データベース > mysql チュートリアル > MySQL の同じテーブルを変更するトリガー内でテーブルを更新できないのはなぜですか?

MySQL の同じテーブルを変更するトリガー内でテーブルを更新できないのはなぜですか?

Patricia Arquette
リリース: 2024-11-08 22:52:02
オリジナル
776 人が閲覧しました

Why Can't I Update a Table Inside a Trigger That's Modifying the Same Table in MySQL?

トリガーのトラブルシューティング: テーブル変更との非互換性

MySQL では、トリガーは、特定のイベントに基づいてデータベース アクションを自動化するために使用される強力なツールです。ただし、トリガーの実行中に問題が発生した場合は、トラブルシューティングが重要です。この記事では、MySQL トリガーが機能しないときに発生する一般的なエラーについて説明します。

問題の説明:

ユーザーから、トリガーが特定の列 (PTS) を更新していないと報告されました。 ) pos_table 内の対応する play_games 列が変更されたとき。クエリが手動で動作しているにもかかわらず、トリガーは更新をトリガーできませんでした。

トリガー構造:

CREATE TRIGGER `upd_PTS` AFTER UPDATE ON `pos_table`
FOR EACH ROW BEGIN
    IF (NEW.played_games <> OLD.played_games)
    THEN  
        update pos_table set PTS=((NEW.won_games*2)+(NEW.tie_games*1));
    END IF;
END
ログイン後にコピー

エラーが発生しました:

played_games 列を手動で編集しようとすると、「テーブルを更新できません」というエラーが表示されました。ストアド関数/トリガーの pos_table は、このストアド関数/トリガーを呼び出したステートメントによってすでに使用されているためです。

解決策:

この問題は、トリガーがトリガーイベント (played_games の更新) で参照されていたのと同じテーブル (pos_table) を変更しようとしていました。 MySQL のストアド プログラムの制限に記載されているように、ストアド関数またはトリガーは、呼び出し元のステートメントによって既に使用されているテーブルを変更できません。

代替解決策:

回避するにはこの問題がある場合は、代わりに BEFORE INSERT トリガーを使用することをお勧めします。この場合、トリガーは次のように変更できます:

CREATE TRIGGER `upd_PTS` BEFORE INSERT ON `pos_table`
FOR EACH ROW BEGIN
    SET NEW.PTS = ((NEW.won_games*2)+(NEW.tie_games*1));
END
ログイン後にコピー

追加の考慮事項:

発生したエラーに加えて、この記事では次の問題も強調しています。 PTS のような計算列を保存します。表示中に他の列から簡単に計算できるため、別の列として保存しない方が効率的でエラーが少なくなる可能性があります。

以上がMySQL の同じテーブルを変更するトリガー内でテーブルを更新できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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