mysql set date_MySQL更新SET值

我试图创建一个将通过一些IF ELSEIF语句运行的触发器,并检查新值是否为NULL,但它只会转到第一个IF语句.

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

测试(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,而是想要遍历所有列以检查它的值是否已更改.

标签:mysql

来源: https://codeday.me/bug/20190530/1182208.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值