我正在尝试使用触发器在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完成工作,但反之亦然
答案 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
仍在使用中(因此被锁定以进一步读取或写入),即第一个表更新,其中这些级联触发器被触发。
<强>建议强>: 尝试实施一个程序并通过您的应用程序调用它。