对模糊标题表示道歉 - 希望这可以更好地解释:
以下触发器在更新后触发(按设计)但在mylist
或IF
字段均未更新时触发了两个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
语句没问题,那么触发触发器的此语句肯定不会导致IF
和prospectid
字段执行某些操作以使propertyid
评估真???
IF
答案 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来覆盖优先顺序,当涉及OR
和AND
运算符时,我们经常需要这样做。
目前尚不清楚你想要达到的目标,所以我们只是在猜测。
也许您想要检查列的值是否已已更改。
IF NOT NEW.col <=> OLD.col THEN
-- value of col has changed
END IF;