【问题标题】:SQL Trigger to update OLD value in another tableSQL 触发器更新另一个表中的旧值
【发布时间】:2020-11-10 15:40:54
【问题描述】:

我正在尝试创建一个trigger,以同时使用相同的数据更新与我更新的table不同的table

我有两个具有相同表的不同数据库,我正在尝试同步它们,当我从一个表插入、更新或删除数据时,我想使用触发器自动对另一个表执行相同操作。

这是触发代码:

CREATE DEFINER=`Ivan_test`@`%` TRIGGER `Prueba_Ivan`.`mag_articulos_PI_AFTER_UPDATE` AFTER UPDATE ON `mag_articulos_PI` FOR EACH ROW
BEGIN
    IF OLD.Prueba_Ivan.mag_articulos_PI NOT IN (SELECT * FROM ivan_test.mag_articulos_IT) THEN
    INSERT INTO ivan_test.mag_articulos_IT 
            VALUES (new.xempresa_id, new.xarticulo_id, new.xcategoria_id, new.xvisible_web, new.xnovedad,new.xpromocion,new.ximagen_prelim,new.ximagen_amp,new.xtexto1,new.xtexto2,new.xtexto3,new.xtexto4,new.xtexto5);
    ELSE 
    UPDATE ivan_test.mag_articulos_IT SET OLD.ivan_test.mag_articulos_IT = NEW.Prueba_Ivan.mag_articulos_PI;    
    END IF;
END 

但我有这个错误: Error Code: 1109. Unknown table 'OLD.Prueba_Ivan' in IN/ALL/ANY subquery

谁能帮我找出错误?

谢谢!!

【问题讨论】:

  • 表定义在哪里? OLD.Prueba_Ivan.mag_articulos_PI 是对什么的引用?
  • 您可以访问 OLD。值,但您无法更新它们...
  • 没有必要用表名来限定列 - 这是我假设你在这里尝试做的 - OLD.Prueba_Ivan.mag_articulos_PI 如果你这样做了,我猜想和 sql 中的其他所有内容一样表名会排在第一位。此外,没有证据表明您正在设置分隔符或任何理解方式,如果您确实需要设置它们,因为您没有告诉我们您是否在工作台中使用向导。
  • @Scratte OLD.Prueba_Ivan.mag_articulos_PI 在更新前引用数据库 Prueba_ivan,表 mag_articulos_PI。我正在尝试检查要更新的行是否在另一个表中,如果不是,我添加它。
  • 我认为您不能以这种方式引用数据库。我认为 MySQL 期望旧值是触发器的表 mag_articulos_PI 上的列。除了表定义之外,如果您用文字解释您正在尝试做什么,并且如果您有多个数据库,如果您尝试更新这些数据库中的数据,这将非常有帮助。

标签: mysql sql triggers sql-update mysql-workbench


【解决方案1】:

OLD.Prueba_Ivan.mag_articulos_PI

OLD 是触发行的别名。您的trigger 适用于Prueba_Ivan,这意味着OLDNEW 分别代表您在更改之前和之后的Prueba_Ivan 记录。这意味着当您打算引用mag_articulos_PI 时,您需要通过OLD.mag_articulos_PI 来完成,因此请从该表达式中删除表名。

OLD.ivan_test.mag_articulos_IT

如上一节所述,这里的OLD 是更新的Prueba_Ivan 记录的另一个自我,您不需要它来引用ivan_test

进一步说明

一种形式的表达

a.b.c

如下:

在数据库a,表b,列c。当你做类似的事情时

OLD.t.c

它显示:在 OLD 数据库中,表 t,列 c。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 2012-06-23
  • 1970-01-01
相关资源
最近更新 更多