0

月の列が 12 のときに年の列を自動的に 1 増やし、月の列を空にするトリガーを作成しようとしています。しかし、私はトリガーをよく理解しておらず、試行錯誤しているので、誰かがこのコードを調べて、機能するかどうかを確認したり、改善を提案したりできることを望んでいました:

CREATE TRIGGER aging BEFORE UPDATE ON dogs
FOR EACH ROW
DELETE FROM dogs WHERE month = 12;
UPDATE year SET year = year+1;

ありがとう!

4

2 に答える 2

2

指摘する2つのこと...

まず、やりたいことに対してトリガーを選択するのは明らかに間違っています。日付の生年月日に基づいてその場で年齢を計算することでトリガーを回避できるからだけではありません。また、トリガーは、対応するステートメントによって影響を受ける行にのみ影響するためです。にだまされないでくださいFOR EACH ROW。あなたは次のようなものを書きます

UPDATE table SET whatever = whatever WHERE month = 12;

month = 12 が true であるすべての行が影響を受けます。あなたがしたいことは、テーブル全体を更新して、いくつかの行で条件が真かどうかを確認することです。これはパフォーマンスの悪夢であるだけでなく、テーブルごとに (イベントごとに) 1 つのトリガーに制限されます。つまり、 oneBEFORE UPDATEと 1は使用できますAFTER UPDATEが、 2 は使用できませんBEFORE UPDATE

2 つ目の注意点は、UPDATE トリガーで UPDATE ステートメントを発行できないことです。これにより、無限ループが発生します:)

代わりに、エイリアスNEWOLD. NEWUPDATE ステートメントによって指定された列の値をOLD参照し、UPDATE ステートメントが実行される前の列の値を参照します。

あなたの場合(この場合はトリガーを使用すべきではないことが今では明らかになっていることを願っていますが)、トリガーを次のように記述します。

この最初の声明を考えると

UPDATE myTable SET whatever = whatever;

テーブル全体を更新する、このトリガー

DROP TRIGGER IF EXISTS [whatever you call this thing];

DELIMITER @@
CREATE TRIGGER aging BEFORE UPDATE ON dogs
FOR EACH ROW
    IF (month = 12) THEN /*month refers to the column here, not a variable like in Gordon's answer*/
       SET NEW.year = OLD.year+1;
       SET NEW.month = 1;
    END IF;
END @@

列を正しく更新します。

于 2013-09-13T09:20:57.370 に答える