更新後に独自のトリガー内で同じテーブルを更新しようとすると、一般的な課題が発生します。これは、同じ行内の他の列への変更に基づいてテーブル内の特定の列を変更するようにトリガーが設計されている場合に顕著になります。
次のシナリオを考えてみましょう。スコアが更新されるたびに、「products_score」テーブルの「votes_total」列を更新したいと考えています。変更されました:
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)
ただし、テーブルの更新を実行すると、エラーが発生します:
#1442 - Can't update table 'products_score' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
このエラーは、トリガーのロジック内の循環参照によって発生します。 update ステートメントは「votes_total」列を変更しようとします。トリガーは新しい合計を計算する際にもこの列に依存します。
この問題を回避するには、トリガーを次のように変更します。更新後ではなく更新前に実行します:
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」を計算します。実際の更新が行われる前に、その値を「新しい」行オブジェクトに割り当てます。これにより、循環参照の問題が発生することなく更新ステートメントを続行できるようになります。
以上がMySQL トリガーによるテーブル更新エラーを解決するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。