同じテーブル更新後のトリガー更新
データベース システムでは、テーブル内で特定のイベントが発生したときに、トリガーを使用して特定のアクションを自動的に実行します。テーブルの更新後にトリガー内から同じテーブルを更新しようとすると、一般的な問題が 1 つ発生します。
次のトリガーについて考えてみましょう。
CREATE TRIGGER upd_total_votes AFTER UPDATE ON products_score FOR EACH ROW UPDATE products_score SET products_score.votes_total = (SELECT (votes_1 + votes_2 + votes_3 + votes_4 + votes_5) FROM products_score WHERE id = new.id);
次のようにテーブルを更新しようとする場合:
UPDATE products_score SET votes_1 = 5 WHERE id = 0;
トリガーは次のエラーで失敗します:
#1442 - Can't update table 'products_score' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
解決するにはこの場合、トリガーは、更新イベントの後ではなく、前に実行されるように変更する必要があります。これにより、元の更新ステートメントが適用される前にトリガーでテーブルを更新できるようになります。
CREATE TRIGGER upd_total_votes BEFORE UPDATE ON products_score FOR EACH ROW BEGIN SET new.votes_total = new.votes_1 + new.votes_2 + new.votes_3 + new.votes_4 + new.votes_5; END;
この変更により、以前と同様にテーブルを更新すると、votes_total 列の更新が正常にトリガーされます。
以上がAfter Update トリガーを使用する際の「ストアド関数/トリガーのテーブルを更新できません」エラーを防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。