トリガーのトラブルシューティング: テーブル変更との非互換性
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 サイトの他の関連記事を参照してください。