2017-02-16 60 views
0

道歉含糊的标题触发器 - 希望这解释更好:MySQL的IF逻辑中,与新老

下面的触发更新后起火(如设计),但两个IF语句射击时既不prospectidpropertyid字段已更新。

所以第一个问题是,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语句都ok,当然这声明,将触发该触发器不是导致prospectidpropertyid领域做一些事情,使IF评估真正???

UPDATE t_enquiries SET recordstatus = 3, enquirystatus = 1 WHERE id = xxx; 
+0

的[这是什么操作<=>在MySQL?]可能的复制(http://stackoverflow.com/questions/21927117/what-is-this-operator-in-mysql) – Ravi

回答

0

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

<=>(宇宙飞船)运算符是空安全的相等比较运算符。

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

速记一旦我们对SQL三值的布尔逻辑的好把手(TRUE,FALSE,NULL),经营者应当不存在任何困难。

可能会令人困惑的一个领域是操作符的优先顺序。 https://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html

我们可以用括号来更改优先顺序,这是我们经常需要当两个ORAND运营商都参与的事:不过还好,就是MySQL参考手册这里记载。


目前还不清楚你试图达到什么,所以我们只是猜测。

也许你想检查一列的值是改变了

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

解决了解了飞船并插入那个'NOT'。谢谢! – Warren