2017-02-16 3 views
0
漠然とタイトル

謝罪とトリガー内部のロジックIF - うまくいけば、これはよりよい説明:MySQLのNEWとOLD

以下のトリガが、更新後に発射される(設計どおり)が、ときprospectidどちらも2つのIF文が発射されていますまたはpropertyidフィールドが更新されます。

最初の質問は、IFロジックに問題がありますか? <><=> ...といくつかの問題があることを思い出しましたか?

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は、aとbがNULLでなく、互いに等しくない場合にTRUEと評価されます。

<=>(spaceship)演算子は、null安全な等価比較演算子です。我々はSQLトリ値ブール論理には良いのハンドルを持っていたら

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

の省略形です(TRUE、NULL、FALSE)、演算子は任意の難易度を提示してはなりません。

混乱させる可能性のある領域は、演算子の優先順位です。 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

関連する問題