MySQL错误1442使用2个触发器更新2个不同数据库上的2个表的字段

时间:2017-06-04 15:15:50

标签: mysql triggers synchronization

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

我找到了一些例子并试图让它们适应这个要求,为什么不成功并显示这个错误...

  

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

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

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

触发db2,表库存:

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完成工作,但反之亦然

1 个答案:

答案 0 :(得分:1)

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

  

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

这样做会产生错误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.

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

  

不允许修改已经使用的表格(适用于   阅读撰写

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

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