如何在MySql中创建触发器以根据另一个表自动更新列?

时间:2017-08-14 11:50:35

标签: mysql triggers

实施例

表1有两个字段:(1)公司代码& (2)供应商准则 表2还有两个字段:(1)公司代码& (2)供应商代码

表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

1 个答案:

答案 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