MySql错误:无法更新存储的函数/触发器中的表

时间:2014-08-14 12:55:42

标签: mysql sql triggers

我正在使用MySQL和Engine InnoDB。我有一个包含4列的SQL表(简化),如下图所示:

enter image description here

当需求状态变为"完成"我希望它的优先级为空,并且所有具有上述优先级的需求都会减少。

例如,如果第二个需求:"面包"是"完成",它的优先级将被设置为空,我想要"黄油"优先级为2," Jam"优先级为3。

我有这个触发器:

DELIMITER |
CREATE TRIGGER modify_priority_trigger BEFORE UPDATE ON your_table
FOR EACH ROW 
begin
    if NEW.State= 'Done'
    then
       update your_table
       set priority = priority - 1
       where priority is not null
       and priority > NEW.priority;

       set NEW.priority = NULL;
    end if;
end
|
delimiter ;

但是当我从" In Progress"中的状态编辑一行时,我出错了。到"完成"。

  

#1442 - 无法更新表格'要求'在存储的函数/触发器中,因为它已被调用此存储的语句使用   功能/触发。

我在互联网上查找过这个错误,但这是我第一次使用SQL触发器,所以我没有成功解决我的问题。 感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

当您尝试更新表时,您会在触发器处启动无限循环,触发器不是用于更新自己的表,您可以创建一个新表来保存表的主键值和优先级值,以便您可以更新该表的优先级。在您的应用程序或您将使用的任何地方,您可以加入这两个表。您也可以考虑在应用程序端使用以下sql更新表:

update your_table set state = 'NEW' and priority = priority - 1 where ....

还可以编写一个新的存储过程来每隔5/10分钟自动运行一次(无论需要什么)。