【问题标题】:mysql trigger stored trigger is already used by statement which invoked stored triggermysql 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 ;

【问题讨论】:

    标签: mysql sql triggers mysql-error-1442


    【解决方案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;
    

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

    【讨论】:

      猜你喜欢
      • 2019-05-20
      • 2013-02-24
      • 2015-11-03
      • 2022-11-17
      • 2023-01-19
      • 1970-01-01
      • 2015-02-13
      • 2017-05-23
      相关资源
      最近更新 更多