Mysql 2 在同一个触发器中更新

Posted

技术标签:

【中文标题】Mysql 2 在同一个触发器中更新【英文标题】:Mysql 2 updates in the same trigger 【发布时间】:2016-11-01 01:13:25 【问题描述】:

我有 2 个表路由和位置。当路由表中的驱动程序名称或 rt_num 发生更改时,我需要更新 loc 表。我整天都在尝试使用以下代码。每个 UPDATE 语句都作为它自己的触发器。我不确定它是否可以完成。

 分隔符 |
    在 `route` 更新后创建触发器`add2`
    每一行
    开始
    在“路线”更新后;

    更新位置
      SET drivername = new.driver_d_name
      WHERE rt_nanme = old.rt_num;

   更新位置
    SET rt_nanme = new.rt_num
    WHERE rt_nanme = old.rt_num;

    结尾;
    |
    分隔符;

【问题讨论】:

【参考方案1】:

为什么要重复after update 声明?

此外,您不需要两个更新语句。所以:

DELIMITER $$

CREATE TRIGGER `add2` AFTER UPDATE ON `route`
FOR EACH ROW 
BEGIN

    UPDATE loc
        SET drivername = new.driver_d_name,
            rt_nanme = new.rt_num
    WHERE rt_nanme = old.rt_num;

END;$$

DELIMITER ;

【讨论】:

谢谢 Gordon Linoff 的工作就像一个魅力。我是 65 岁的新手,我倾向于把事情复杂化。【参考方案2】:

更新前与旧值比较

DELIMITER |
    CREATE TRIGGER `add2` AFTER UPDATE ON `route`
    FOR EACH ROW 
    BEGIN
       IF(new.driver_d_name!=old.driver_d_name) THEN
            UPDATE loc
            SET drivername = new.driver_d_name
            WHERE rt_nanme = old.rt_num;
        END IF;
       IF(new.rt_num!=old.rt_num) THEN
           UPDATE loc
            SET rt_nanme = new.rt_num
            WHERE rt_nanme = old.rt_num;    
          END IF;
    END;
    |   
    DELIMITER ;

【讨论】:

【参考方案3】:

having multiple updates in a single trigger 没有任何问题。但是您的触发器有语法问题,这可能是导致失败的原因。试试这个:

DELIMITER |
CREATE TRIGGER `add2` AFTER UPDATE ON `route`
FOR EACH ROW 
BEGIN

    UPDATE loc
    SET drivername = new.driver_d_name
    WHERE rt_nanme = old.rt_num;

    UPDATE loc
    SET rt_nanme = new.rt_num
    WHERE rt_nanme = old.rt_num;    

END

【讨论】:

以上是关于Mysql 2 在同一个触发器中更新的主要内容,如果未能解决你的问题,请参考以下文章

触发器导致在视图中使用的表上插入后,如何进行 MYSQL 视图更新

引发错误,防止 MySQL 触发器中的表更新

MySQL 触发器用于在更新当前表中的值时更新另一个表

MYSQL 更新触发器 - 无法更新存储函数/触发器中的表,因为它已被语句使用

mysql级联更新的两种方式:触发器更新和外键

MySql一个未设置成功的触发器