4

Triggerいくつかのステートメントを実行しIF ELSEIFて新しい値を確認するを作成しようとしていますが、最初のステートメントNULLにしか行きません。IF

これTriggerAFTER UPDATE。私の質問は、私が唯一SETの列値SETであるNULLかどうかです。SETこのUPDATEコマンドがない場合、この列をテストするにはどうすればよいですか。

更新の例:

UPDATE  `stations_us`.`current_prices` SET  `midPrice` =  '3.59' WHERE  `current_prices`.`_id` =1;

現時点では更新されていないが、PHP スクリプトに基づいて更新できる他の列があります。

引き金:

BEGIN
-- Definition start
IF(NEW.regPrice IS NOT NULL) THEN
INSERT INTO prices (stationID, price, type, 
prevPrice, prevDate, dateCreated, apiKey, uid) 
VALUES(NEW.stationID, NEW.regPrice, 'reg', OLD.regPrice,
OLD.regDate, NEW.regDate, NEW.lastApiUsed, NEW.lastUpdatedBy);

ELSEIF(NEW.midPrice IS NOT NULL) THEN
INSERT INTO prices (stationID, price, type, 
prevPrice, prevDate, dateCreated, apiKey, uid) 
VALUES(NEW.stationID, NEW.midPrice, 'mid', OLD.midPrice,
OLD.midDate, NEW.midDate, NEW.lastApiUsed, NEW.lastUpdatedBy);

ELSEIF(NEW.prePrice IS NOT NULL) THEN
INSERT INTO prices (stationID, price, type, 
prevPrice, prevDate, dateCreated, apiKey, uid) 
VALUES(NEW.stationID, NEW.prePrice, 'pre', OLD.prePrice,
OLD.preDate, NEW.preDate, NEW.lastApiUsed, NEW.lastUpdatedBy);
END IF;
-- Definition end
END
4

1 に答える 1

6

SET 句でどの列が参照されたかは、トリガー内ではわかりません。

colの値を比較することによって、 の値がステートメントによって変更されたかどうかのみを確認できます。NEW.colOLD.col

IF NOT (NEW.regPrice <=> OLD.regPrice)

値が変更されたかどうかを確認するには、テスト(NEW.col IS NOT NULL)だけでは不十分です。古い値がたとえば 4.95 で、新しい値が NULL の場合を考えてみましょう。おそらくその変更を検出したいようです。


UPDATE ステートメントは、複数の列に値を設定する場合があることに注意してください。

UPDATE foo SET col1 = 'a', col2 = 'b', col3 = 'c' WHERE ...

また、列を NULL に設定することも、列を既存の値に設定することもできます。

UPDATE foo SET col1 = 'a', col2 = NULL, col3 = col3 WHERE ...

この場合、OLD 値と NEW 値が等しいため、トリガー内でNEW.col2は NULL と評価され、1 (TRUE) と評価されます。(NEW.col3 <=> OLD.col3)

(AFTER UPDATE トリガーが実際に見ているのは、保存された値です。これは、BEFORE INSERT トリガーが値をいじり、その列に別の値を提供した場合、UPDATE ステートメントからの値であるとは限りません。)

値の変更をログに記録することが目的の場合、おそらく ELSIF は必要ありませんが、代わりにすべての列を実行して、値が変更されたかどうかを確認する必要があります。

于 2012-08-01T16:37:20.203 に答える