2017-02-16 41 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