MySQL更新SET值

时间:2012-08-01 16:28:10

标签: mysql

我正在尝试创建一个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

1 个答案:

答案 0 :(得分:6)

您无法在触发器内部告诉SET子句中引用了哪些列。

您只能通过比较colNEW.col的值来检查语句是否更改了OLD.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 ...

在这种情况下,在触发器内部,NEW.col2将评估为NULL,(NEW.col3 <=> OLD.col3)将评估为1(TRUE),因为OLD和NEW值相等。

(你的AFTER UPDATE触发器实际看到的是存储的值,如果BEFORE INSERT触发器已经与值混淆,则不一定是UPDATE语句中的值,并为该列提供了不同的值。)

如果你的目的是记录值的变化,你可能不想要ELSIF,而是想要遍历所有列来检查它的值是否已经改变。