无法更新存储函数/触发器中的表“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”,因为它已被调用此存储函数/触发器的语句使用的主要内容,如果未能解决你的问题,请参考以下文章
错误代码:1442。无法更新存储函数/触发器中的表“客户”,因为它已被调用此存储函数的语句使用
MySql 错误:无法更新存储函数/触发器中的表,因为它已被调用此存储函数/触发器的语句使用
如何解决错误 1442:无法更新 mysql 中存储的函数/触发器中的表 'tb_name'?