mysql - 触发: Referencing updated attribute

标签 mysql sql triggers sql-update

我有一个更新触发器。

从 UPDATE SQL 命令未更新的表中引用属性的正确过程是什么?该属性是否仍在 UPDATE 变量中?我想获取更新行的该属性的值。

最佳答案

您可以使用关键字OLD来访问MySQL中更新前和更新后的列的值和NEW .

例如,如果您想确定列的值在更新期间是否实际上已更改,您可以这样做

IF NOT OLD.column_name <=> NEW.column_name THEN
    -- do something here
END IF;

注意: <=> MySQL 中的 NULL 安全比较运算符

顺便说一句:没有 UPDATED MySQL 中的虚拟表。它来自 SQL Server。

这是一个 SQLFiddle演示。 请注意,即使更新影响了表中的所有记录,log 中仅记录了一条消息 table 。这是因为 id 为 2 的行的值最终保持不变。

<小时/>

更新:保留您的 finished同步标记您需要所有事件(插入、更新、删除)的触发器。

DELIMITER //
CREATE TRIGGER tg_ai_event
AFTER INSERT ON event
FOR EACH ROW
BEGIN
  UPDATE activity a
     SET status = (EXISTS(SELECT * 
                            FROM event 
                           WHERE activity = a.activity_id
                             AND done = 0))
   WHERE activity_id = NEW.activity;
END//

CREATE TRIGGER tg_ad_event
AFTER DELETE ON event
FOR EACH ROW
BEGIN
  UPDATE activity a
     SET status = (EXISTS(SELECT * 
                            FROM event 
                           WHERE activity = a.activity_id 
                             AND done = 0))
   WHERE activity_id = OLD.activity;
END//

CREATE TRIGGER tg_au_event
AFTER UPDATE ON event
FOR EACH ROW
BEGIN
  IF NOT OLD.activity <=> NEW.activity THEN
    -- if activity id was changed for an event then clculate finished flag
    -- for both old and new activity id
    UPDATE activity a
       SET status = (EXISTS(SELECT * 
                              FROM event 
                             WHERE activity = a.activity_id 
                               AND done = 0))
     WHERE activity_id IN(OLD.activity, NEW.activity);
  ELSE
    -- otherwise calculate finished flag only if done flag is changed 
    IF NOT OLD.done <=> NEW.done THEN
      UPDATE activity a
         SET status = (EXISTS(SELECT * 
                                FROM event 
                               WHERE activity = a.activity_id 
                                 AND done = 0))
       WHERE activity_id = NEW.activity;
    END IF;
  END IF;
END//
DELIMITER ;

这里是SQLFiddle 演示

关于mysql - 触发: Referencing updated attribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21270318/

相关文章:

php - Laravel 关系数据库连接

mysql - 通过连接到自身和子选择来更新表

linux - Mysqldump - 删除所有外部连接

PHP 语法 |在数组中使用变量

c# - SQL注入(inject)单引号漏洞

SQL 优化 - 执行计划根据约束值更改 - 为什么?

php - Laravel SQL 条件查询

sql - 触发器以确保总和小于不同表中的值

MySQL 触发器语法错误 #1064

oracle - 使用 Oracle 触发器检索用户名