表1是一个'目录'它将供应商的代码分别与我们公司的代码相匹配。 对于表2,供应商的代码将由一个人输入。然后,触发器将搜索表1并找到匹配公司的代码并自动填充该列。
我创建了一个触发器,但是我意识到我的表已被锁定,我无法添加任何数据。出现错误:无法更新存储函数/触发器中的表,因为它已被调用此存储函数/触发器的语句使用。
CREATE DEFINER=`root`@`localhost` TRIGGER `mydb`.`whole_rolls_AFTER_INSERT` AFTER INSERT ON `whole_rolls` FOR EACH ROW
BEGIN
UPDATE whole_rolls
INNER JOIN reference_table on whole_rolls.supplierFoilCode = reference_table.supplierFoilCode
SET whole_rolls.parentFoilCode = reference_table.parentFoilCode;
END
那么我怎样才能实现我想要做的事情呢?
示例数据
表1(reference_table)
Parent Foil Code Supplier Foil Code
SLV1-AEEGLB 12345
SLV2-AEEGLB 12346
SLV3-AEEGLB 12347
SLV4-AEEGLB 12348
SLV5-AEEGLB 12349
表2(whole_rolls)
Parent Foil Code Supplier Foil Code
[Automatic] 12348
答案 0 :(得分:0)
在你的问题中,你说基于table1你想更新table2。
您的触发器正在插入table2并尝试更新table2。
我想你想要类似下面的东西
UPDATE reference_table
set reference_table.parentFoilCode = NEW.parentFoilCode
WHERE reference_table.supplierFoilCode = NEW.supplierFoilCode
而不是您正在使用的查询将导致该错误升高。
或者您将不得不改变指向触发器的位置。您的触发器必须引用引用表而不是whole_rolls表。
变化
CREATE DEFINER=`root`@`localhost` TRIGGER `mydb`.`whole_rolls_AFTER_INSERT` AFTER INSERT ON `whole_rolls` FOR EACH ROW
到
CREATE DEFINER=`root`@`localhost` TRIGGER `mydb`.`reference_table_AFTER_INSERT` AFTER INSERT ON `reference_table` FOR EACH ROW
编辑:
在您的澄清评论之后,您想要的不是插入后插入,而是插入之前
你还必须到下面。这是我认为你需要你的代码可能会有所不同的一个例子
你基本上从参考表中获取父牌代码并将其存储在一个变量中,然后你就可以从查找表中更改你想要的父牌代码的新数据值(这是你要插入的记录) 。
SELECT @parentFoilCode := parentFoilCode
FROM reference_Table where
supplierFoilCode = NEW.supplierFoilCode
SET NEW.supplierFoilCode = @parentFoilCode