gpt4 book ai didi

MySQL 更新 SET 值

转载 作者:可可西里 更新时间:2023-11-01 07:28:33 25 4
gpt4 key购买 nike

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

这个触发器AFTER UPDATE。我的问题是,如果我只是 SET 一列值,其他 SET 值是什么,它们是 NULL 还是什么。如果此列不是 UPDATE 命令的 SET,我该如何测试它。

示例更新:

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

还有其他列暂时不更新,但可以根据PHP Script更新。

触发器:

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 子句中引用了哪些列。

只能检查col的值是否为通过比较 NEW.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),因为旧值和新值相等。

(您的 AFTER UPDATE 触发器真正看到的是存储的值,如果 BEFORE INSERT 触发器已经弄乱了该值,并且为该列提供了不同的值,则该值不一定是您的 UPDATE 语句中的值。)

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

关于MySQL 更新 SET 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11763599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com