【问题标题】:How to determine which column updates?如何确定哪些列更新?
【发布时间】:2016-05-14 17:42:38
【问题描述】:

我有这些表:

// users
+----+--------+--------------+------------+---------------------------+
| id |  name  |    phone     | postalcode |           email           |
+----+--------+--------------+------------+---------------------------+
| 1  | john   | 0338294214   | 65462345   | fer.74@gmail.com          |
| 2  | jack   | 0657359930   | 93827424   | jack_m@yahoo.com          |
| 3  | peter  | 0083247242   | 99849422   | mv2003@hotmail.com        |
+----+--------+--------------+------------+---------------------------+

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

我也有这个触发器 AFTER UPDATEusers table::

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 列更新时执行该触发器。 (不是namepostalcodeemail 更新)。我该如何定义该条件?

【问题讨论】:

    标签: mysql sql sql-update sql-insert


    【解决方案1】:

    在触发器中,我们可以使用oldnew 来引用列的值、更新前的值以及要分配的新值。

    例子:

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

    &lt;=&gt;(宇宙飞船运算符)是一个 NULL 安全比较,即使比较 NULL 值,它也会返回 TRUE 或 FALSE。

    【讨论】:

    • 一个小问题,&lt;=&gt;表示不等于。那么NOT 是什么?我认为您必须说:如果 phone 列的旧值和第一个值不相等,则“电话已更改”。所以我相信您必须删除 NOT
    • @stack: &lt;=&gt; 表示...“NULL 安全相等。此运算符执行与 = 运算符类似的相等比较,但如果两者都返回 1 而不是 NULL操作数为 NULL,如果一个操作数为 NULL,则为 0 而不是 NULL。"参考:http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    相关资源
    最近更新 更多