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 视图更新