ホームページ > データベース > mysql チュートリアル > MySQL トリガーによるテーブル更新エラーを解決するには?

MySQL トリガーによるテーブル更新エラーを解決するには?

DDD
リリース: 2024-12-26 22:44:13
オリジナル
214 人が閲覧しました

How to Resolve the MySQL Trigger-Induced Table Update Error?

トリガーによるテーブル更新のジレンマ

更新後に独自のトリガー内で同じテーブルを更新しようとすると、一般的な課題が発生します。これは、同じ行内の他の列への変更に基づいてテーブル内の特定の列を変更するようにトリガーが設計されている場合に顕著になります。

例: 列の合計の計算

次のシナリオを考えてみましょう。スコアが更新されるたびに、「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 サイトの他の関連記事を参照してください。

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