mysql trigger 存储触发器已被调用存储触发器的语句使用

Posted

技术标签:

【中文标题】mysql trigger 存储触发器已被调用存储触发器的语句使用【英文标题】:mysql trigger stored trigger is already used by statement which invoked stored trigger 【发布时间】:2010-12-07 15:34:51 【问题描述】:

我想设置一个触发器,以便如果在更新时预测字段 = 3,那么触发器会将值更改为 4 并将其保存在数据库中。触发器如下。

由于某种原因,我不断收到错误消息:

#1442 - Can't update table 'tzanalytic\_forecast\_cached' in stored 
function/trigger because it is already used by statement which invoked 
this stored function/trigger.

这是正确的设置方式吗?

delimiter $$ 
CREATE TRIGGER no_BoW BEFORE UPDATE ON t FOR EACH ROW 
BEGIN set @prediction = new.prediction; 
UPDATE t SET t.prediction = (SELECT IF(@prediction = '3', '4', @prediction)) WHERE t.event_id = new.event_id AND t.price_tier = new.price_tier; END;
$$ delimiter ;

【问题讨论】:

【参考方案1】:

mysql 触发器无法操作分配给它们的表。所有其他主要 DBMS 都支持此功能,因此希望 MySQL 很快会添加此支持。

http://forums.mysql.com/read.php?99,122354,240978#msg-240978

【讨论】:

谢谢你:) - 你帮助了我 而我,这是一个非常烦人的错误 每天我更讨厌mysql SI 这在 5.5 版上仍然适用?【参考方案2】:

此外,您需要确保没有其他过程或函数对分配此特定过程的表执行更新,否则您最终会出现递归。比如

create trigger trig1 After update on table1 FOR EACH ROW 
BEGIN 
UPDATE table2 SET colum1 = column1 + 1
END;

create trigger trig2 After update on table2 FOR EACH ROW 
BEGIN 
UPDATE table1 SET colum2 = column2 + 1
END;

这将以递归结束,因此请注意现有的存储过程和函数。

【讨论】:

以上是关于mysql trigger 存储触发器已被调用存储触发器的语句使用的主要内容,如果未能解决你的问题,请参考以下文章

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

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

在 MySQL“删除前”中触发

TRIGGER 语法错误 mysql 说 #1303 - 无法从另一个存储的例程中创建触发器 - phpmyadmin

mysql触发器(Trigger)的作用

mysql触发器(Trigger)简明总结和使用实例