MySQL IF逻辑内部触发器与NEW和OLD

时间:2017-02-16 03:41:52

标签: mysql

对模糊标题表示道歉 - 希望这可以更好地解释:

以下触发器在更新后触发(按设计)但在mylistIF字段均未更新时触发了两个prospectid语句。

所以第一个问题是,propertyid逻辑是否有问题?我记得在IF vs <> ...?

时遇到了一些问题
<=>

如果我的CREATE TRIGGER myTrig AFTER UPDATE ON t_enquiries FOR EACH ROW BEGIN IF (NEW.prospectid <=> OLD.prospectid) OR (NEW.propertyid <=> OLD.propertyid) THEN IF (NEW.prospectid IS NOT NULL) AND (NEW.propertyid IS NOT NULL) THEN INSERT INTO t_prospect_property_link (prospectid, propertyid, remaininginspections) VALUES (NEW.prospectid, NEW.propertyid, 10) ON DUPLICATE KEY UPDATE subscribed = 1, remaininginspections = 10; END IF; END IF; END 语句没问题,那么触发触发器的此语句肯定不会导致IFprospectid字段执行某些操作以使propertyid评估真???

IF

1 个答案:

答案 0 :(得分:0)

<>是一个“不等于”比较运算符。当a和b都是非NULL并且彼此不相等时,a <> b将评估为TRUE。

<=>(太空船)运算符是一个空安全的等式比较运算符。

a <=> b( a = b OR ( a IS NULL AND b IS NULL ))

的简写

一旦我们对SQL三值布尔逻辑(TRUE,FALSE,NULL)有了很好的处理,操作符就不会有任何困难。

可能令人困惑的一个方面是运营商的优先顺序。但幸运的是,MySQL参考手册中记录了这一点:https://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html

我们可以使用parens来覆盖优先顺序,当涉及ORAND运算符时,我们经常需要这样做。

目前尚不清楚你想要达到的目标,所以我们只是在猜测。

也许您想要检查列的值是否已已更改

IF NOT NEW.col <=> OLD.col THEN
   -- value of col has changed
END IF;