MySQL更新集值

MySQL更新集值,mysql,Mysql,我正在尝试创建一个触发器,它将运行一些IF-ELSEIF语句,并检查新值是否为NULL,但是它只会转到第一个IF语句 此触发器是更新后的。我的问题是,如果我只设置了一个列值,那么其他列值设置为什么,它们是NULL还是什么。如果此UPDATE命令未设置此列,如何测试此列 更新示例: UPDATE `stations_us`.`current_prices` SET `midPrice` = '3.59' WHERE `current_prices`.`_id` =1; 还有一些列此时不更

我正在尝试创建一个
触发器
,它将运行一些
IF-ELSEIF
语句,并检查新值是否为
NULL
,但是它只会转到第一个
IF
语句

触发器
是更新后的
。我的问题是,如果我只设置了一个列值,那么其他列值设置为什么,它们是
NULL
还是什么。如果此
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

您无法在触发器内部判断SET子句中引用了哪些列

您只能通过比较
NEW.col
OLD.col
的值来检查语句是否更改了
col
的值

IF NOT (NEW.regPrice <=> OLD.regPrice)
还要注意,列可以设置为NULL,列可以设置为其现有值

UPDATE foo SET col1 = 'a', col2 = NULL, col3 = col3 WHERE ...
在这种情况下,在触发器中,
NEW.col2
将计算为NULL,
(NEW.col3 OLD.col3)
将计算为1(TRUE),因为新旧值相等

(更新后触发器真正看到的是存储的值,如果插入前触发器破坏了该值,并且为该列提供了不同的值,则该值不一定是UPDATE语句中的值。)


如果您的目的是记录值的更改,则可能不希望使用ELSIF,而是希望运行所有列以检查其值是否已更改。

我不明白您所说的“如果未在此更新命令上设置此列,如何测试此列”是什么意思。您能进一步解释吗?
UPDATE foo SET col1 = 'a', col2 = NULL, col3 = col3 WHERE ...