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

时间:2019-03-14 16:57:58

标签: mysql triggers phpmyadmin

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

我的触发器

Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package python3-pip

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

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;

我尝试编写该过程,但此过程不再起作用。

我该如何解决这个问题?

编辑:

示例表:

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

1 个答案:

答案 0 :(得分:0)

首先,从cli或MySQL Workbench运行show triggers;,以查看是否有名为example_trigger的触发器,或者是否为{设置了任何个触发器{1}}。

您只能有1个名为AFTER UPDATE ON example_table的触发器,而对于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语句。

而且,您拼写了“ customer”:)

更新

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

UPDATE