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

Posted

技术标签:

【中文标题】无法更新存储函数/触发器中的表“example_table”,因为它已被调用此存储函数/触发器的语句使用【英文标题】:Can't update table 'example_table' in stored function/trigger because it is already used by statement which invoked this stored function/trigger 【发布时间】:2019-08-05 16:22:52 【问题描述】:

我正在尝试编写一个非常简单的查询。我无法解决这个问题。

我的触发器:

CREATE TRIGGER `example_trigger` AFTER UPDATE ON `example_table`
FOR EACH ROW
if (new.result = 1) THEN
update  example_table set result = 2 where result=0 and costumer_id = new.costumer_id;
end if;

当我将结果更新为 1 时,我想将属于该客户的其他记录的结果更新为 2。 但我得到这个错误:

Can't update table 'example_table' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

我尝试编写程序,但它没有再次工作。

我该如何解决这个问题?

编辑:

示例表:

id   customer_id    result
1         12           0
2         12           5
3         14           4
4         12           3
5         12           0
6         12           0
7         16           3

查询:

UPDATE example_table SET result=1 WHERE customer_id=12 AND id=4

然后触发器将起作用。

我需要:

   id   customer_id    result
    1         12           2      ->trigger
    2         12           5
    3         14           4
    4         12           1      ->update
    5         12           2      ->trigger
    6         12           2      ->trigger
    7         16           3

【问题讨论】:

你能分享执行UPDATE语句的代码吗? 【参考方案1】:

首先,从 cli 或 mysql Workbench 运行 show triggers; 以查看您是否有一个名为 example_trigger 的触发器,或者是否为 AFTER UPDATE ON example_table 设置了任何个触发器。

您只能有 1 个名为 example_trigger 的触发器,并且只能有 1 个名为 AFTER UPDATE ON example_table 的触发器。

然后,将您的代码更改为以下内容应该可以解决您的问题:

DROP TRIGGER example_trigger;

DELIMITER $$

CREATE TRIGGER `example_trigger` BEFORE UPDATE ON `example_table`
FOR EACH ROW
BEGIN

IF (NEW.result = 1) THEN
    SET NEW.result = 2;
END IF;

END $$

DELIMITER ;

在您的代码中,您提供IF result=1 条件,然后在更新语句中提供WHERE result=0。这将导致您的触发器永远不会更新任何内容(或给出错误)。此外,您可以像我的示例中那样使用BEFORE UPDATE 来大大简化您的代码,因为您可以简单地使用SET NEW.col = x 而不必运行整个UPDATE 语句。

另外,你拼错了“客户”:)

更新

您可以使用 CASE 语句通过单个 UPDATE 查询来实现此目的。请注意,您必须禁用“安全更新”才能执行此操作。

SET SQL_SAFE_UPDATES = 0;

UPDATE example_table 
SET result = CASE
    WHEN id=4 THEN 1
    WHEN result=0 THEN 2
    ELSE result
    END WHERE customer_id = 12;

【讨论】:

对不起,我的英语太差了。我想更改其他客户记录的结果。例如:我更新了结果=1。我想把这个客户的其他记录的结果更新为0。你写的触发器只是改变了那个记录。 我不认为触发器可以UPDATE 他们设置为触发的表,除非它是一个BEFORE UPDATE,它只会更改正在更新的值。相反,您应该做的是更新 all* 初始更新语句中的行。 如果你发布你的UPDATE 声明,我可以告诉你我的意思。

以上是关于无法更新存储函数/触发器中的表“example_table”,因为它已被调用此存储函数/触发器的语句使用的主要内容,如果未能解决你的问题,请参考以下文章

MySql 错误:无法更新存储函数/触发器中的表

错误代码:1442。无法更新存储函数/触发器中的表“客户”,因为它已被调用此存储函数的语句使用

MySql 错误:无法更新存储函数/触发器中的表,因为它已被调用此存储函数/触发器的语句使用

如何解决错误 1442:无法更新 mysql 中存储的函数/触发器中的表 'tb_name'?

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

MySQL:在自己的触发器中更新表