11

我想设置一个触发器,以便如果在更新时预测字段 = 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 ;
4

2 回答 2

41

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

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

于 2010-02-22T21:16:25.557 回答
0

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

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;

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

于 2012-07-10T19:50:38.043 回答