我正在使用MySQL和Engine InnoDB。我有一个包含4列的SQL表(简化),如下图所示:
当需求状态变为"完成"我希望它的优先级为空,并且所有具有上述优先级的需求都会减少。
例如,如果第二个需求:"面包"是"完成",它的优先级将被设置为空,我想要"黄油"优先级为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触发器,所以我没有成功解决我的问题。 感谢您的帮助。
答案 0 :(得分:1)
当您尝试更新表时,您会在触发器处启动无限循环,触发器不是用于更新自己的表,您可以创建一个新表来保存表的主键值和优先级值,以便您可以更新该表的优先级。在您的应用程序或您将使用的任何地方,您可以加入这两个表。您也可以考虑在应用程序端使用以下sql更新表:
update your_table set state = 'NEW' and priority = priority - 1 where ....
还可以编写一个新的存储过程来每隔5/10分钟自动运行一次(无论需要什么)。