【问题标题】:MySQL Error 1442 Using 2 triggers to update a field of 2 tables on 2 different databasesMySQL 错误 1442 使用 2 个触发器更新 2 个不同数据库上 2 个表的字段
【发布时间】:2017-11-05 10:31:31
【问题描述】:

我正在尝试使用触发器在 2 个不同数据库的 2 个表中同步数量字段。

我找到了一些示例并尝试使它们适应此要求,为什么不成功并显示此错误...

#1442 - 无法更新存储函数/触发器中的表“oc_product”,因为它已被调用此存储的语句使用 函数/触发器。

...尝试执行此查询时:

UPDATE `db`.`oc_product` SET `quantity` = '220' WHERE `oc_product`.`product_id` = 50

db2 的触发器,表 stock:

DROP TRIGGER IF EXISTS t1_ai &&

CREATE TRIGGER t1_ai BEFORE UPDATE ON stock FOR EACH ROW BEGIN
  IF @__disable_trigger_t1t2 = 1 THEN
    SET @__disable_trigger_t1t2 = NULL;
  ELSE
    SET @__disable_trigger_t1t2 = 1;
    -- trigger logic goes in here
    UPDATE `db1`.oc_product 
    SET  `quantity` = NEW.quantity 
    WHERE SKU = NEW.SKU;
  END IF;
END &&

db1 的触发器,表 oc_product:

DROP TRIGGER IF EXISTS t2_ai &&

CREATE TRIGGER t2_ai BEFORE UPDATE ON oc_product  FOR EACH ROW BEGIN
  IF @__disable_trigger_t1t2 = 1 THEN
    SET @__disable_trigger_t1t2 = NULL;
  ELSE
    SET @__disable_trigger_t1t2 = 1;
    -- trigger logic goes in here
    UPDATE `db2`.stock 
    SET  `quantity` = NEW.quantity 
    WHERE SKU = NEW.SKU; 
  END IF;
END &&

知道如何解决这个错误吗?

额外信息: 如果我对 db2 上的 stock 表执行此查询:

UPDATE `db2`.`stock` SET `quantity` = '220' WHERE `stock`.`id` = 7631;

然后触发器 t1_ai 完成工作,反之则不行

【问题讨论】:

标签: mysql triggers synchronization


【解决方案1】:

原因:您无法更新/删除/插入调用触发器的表(库存):

在存储的函数或触发器中,不允许修改 已被(用于读取或写入)的表 调用函数或触发器的语句。

这样做会产生错误 1442:

Error Code: 1442
Can't update table 'oc_product' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

这里发生了什么,stock 表上的UPDATE 触发第一个触发器“t1_ai”,它在 SQL 中尝试更新 oc_product 表,该表有一个触发器“t1_ai”,它尝试更新/改回stock 表。 因此,如上所述,您:

不允许修改已被使用的表格(例如 阅读写作

对于整个流程(级联触发器),stock 仍在使用中(因此锁定以供进一步读取或写入),即触发这些级联触发器的第一个表更新。


建议: 尝试实现一个过程并通过您的应用程序调用它。

【讨论】:

  • 谢谢,我通过实施您的建议解决了这个问题
猜你喜欢
  • 2016-11-01
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
相关资源
最近更新 更多