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 错误:无法更新存储函数/触发器中的表,因为它已被调用此存储函数/触发器的语句使用
无法更新存储函数/触发器中的表“事务”,因为它已被调用此存储函数/触发器的语句使用