2016-05-14 138 views
0

我有這些表:如何確定哪一列更新?

// users 
+----+--------+--------------+------------+---------------------------+ 
| id | name | phone  | postalcode |   email   | 
+----+--------+--------------+------------+---------------------------+ 
| 1 | john | 0338294214 | 65462345 | [email protected]   | 
| 2 | jack | 0657359930 | 93827424 | [email protected]   | 
| 3 | peter | 0083247242 | 99849422 | [email protected]  | 
+----+--------+--------------+------------+---------------------------+ 

// notifications 
+----+---------+---------------+------------+ 
| id | user_id | content | timestamp | 
+----+---------+---------------+------------+ 
| 1 | 2  | phone updated | 1452642595 | 
+----+---------+---------------+------------+ 

而且我有users表::

DELIMITER // 
CREATE TRIGGER `send_notification` AFTER UPDATE ON `users` 
FOR EACH ROW BEGIN 
    INSERT INTO notification(user_id, content, timestamp) 
        values(new.id, "phone updated", UNIX_TIMESTAMP()) 
END 
// 
DELIMITER 

所有我想要做的就是執行該觸發器就在phone列該觸發器UPDATE AFTER更新。 (不是當namepostalcodeemail更新)。我怎樣才能定義這個條件?

回答

2

在觸發器中,我們可以使用oldnew來引用列的值,更新前的值以及要分配的新值。

實施例:

IF NOT (new.phone <=> old.phone) THEN 
    -- value assigned to phone column changed 
    ELSE 
    -- value of phone column unchanged 
    END IF; 

<=>(宇宙飛船操作者)是一個NULL安全比較,即使當NULL值進行比較,其返回TRUE或FALSE。

+0

似乎是正確的..謝謝.. upvote – stack

+0

一個小問題,'<=>'意味着*不等於*。那麼,什麼是'不'?我認爲你必須說:*如果'phone'列的舊值和第一個值不等於「phone changed」。*所以我相信你必須刪除那個'NOT'。 – stack

+0

@stack:**'<=> **表示......「空安全相等,該運算符與=運算符執行相等比較,但如果兩個操作數均爲NULL,則返回1而不是NULL;如果爲0,則返回1而不是NULL if一個操作數是NULL「。參考:[http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to](http://dev.mysql.com/doc/refman/5.7/en/比較-operators.html#operator_equal通) – spencer7593