指摘する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 ステートメントを発行できないことです。これにより、無限ループが発生します:)
代わりに、エイリアスNEW
とOLD
. NEW
UPDATE ステートメントによって指定された列の値を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 @@
列を正しく更新します。