我正在使用MySQL和Engine InnoDB。我有一个SQL表(简体),其中包含4列,如您在这张图片中看到的:
当需求的状态变为“完成”时,我希望其优先级为空,并且所有具有上述优先级的需求都将递减。
例如,如果第二个需求:“面包”为“完成”,则其优先级将设置为空,并且我希望“黄油”的优先级为2,“果酱”的优先级为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 ;
但是,当我从“进行中”到“完成”的状态编辑行时,出现错误。
#1442 -无法更新存储函数/触发器中的表“需求”,因为调用该存储函数/触发器的语句已使用该表。
#1442
我已经在Internet上寻找了此错误,但这是我第一次使用SQL触发器,所以我没有成功解决问题。谢谢你的帮助。
当您尝试更新表时,在触发器处启动一个无穷循环,触发器不用于更新自己的表,您可以创建一个新表,在其中保存表的主键值和优先级值,以便您可以在该表上更新优先级。在您的应用程序中或将要使用的任何地方,您都可以将这两个表连接起来。您也可以考虑在应用程序端使用以下sql更新表:
update your_table set state = 'NEW' and priority = priority - 1 where ....
还可以编写一个新的存储过程来每隔5/10分钟(无论需要什么)来修复您的数据向导。