MySql 错误:无法更新存储函数/触发器中的表
Posted
技术标签:
【中文标题】MySql 错误:无法更新存储函数/触发器中的表【英文标题】:MySql Error: Can't update table in stored function/trigger 【发布时间】:2014-08-14 12:55:41 【问题描述】:我正在使用 mysql 和 Engine InnoDB。我有一个包含 4 列的 SQL 表(简化),如图所示:
当需求状态变为“完成”时,我希望它的优先级为空,并且所有具有上述优先级的需求都会递减。
例如,如果第二个需求:“面包”是“完成”,它的优先级将设置为空,我希望“黄油”的优先级为 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
- 无法更新存储函数/触发器中的表“需求”,因为它已被调用此存储的语句使用 函数/触发器。
我在 Internet 上查找过这个错误,但这是我第一次使用 SQL 触发器,所以我没有成功纠正我的问题。 感谢您的帮助。
【问题讨论】:
你不应该更新同一个表的任何其他行,但刚刚检查的行,因为它会触发触发器...... 一种无限循环?我怎么能做我想做的呢? 您可以使用存储过程来更新状态并处理此更改的其他影响。请注意,您也不能在更新触发器中使用这样的过程。 【参考方案1】:当您尝试更新表时,您会在触发器处开始无限循环,触发器不是用于更新自己的表,您可以创建一个新表来保存表的主键值和优先级值,以便您可以更新该表的优先级。在您的应用程序或您将使用的任何地方,您可以加入这两个表。您也可以考虑在应用程序端使用以下 sql 更新您的表:
update your_table set state = 'NEW' and priority = priority - 1 where ....
还可以编写一个新的存储过程来修复您的数据每 5/10 分钟自动运行一次(无论需要什么)。
【讨论】:
好的,非常感谢,我会尝试做一个存储过程,手动调用。我是否必须在其中“复制/粘贴”我的触发代码,还是必须全部编写?我以前从未使用过程序。 它不适用于您的触发代码,您应该编写一个新代码来实现新更新的列,例如,如果您持有更新日期或其他内容,那么它必须只更新 state = 'Done' 一次。如果不是,它将始终将所有 state = 'Done' 的优先级更新为少一个值。 好的,谢谢!我在网上看过如何制作存储过程,当您对此一无所知时,这并不容易。我会在我的程序过程中找到另一种方法,并等待明年的课程创建程序。以上是关于MySql 错误:无法更新存储函数/触发器中的表的主要内容,如果未能解决你的问题,请参考以下文章
MySql 错误:无法更新存储函数/触发器中的表,因为它已被调用此存储函数/触发器的语句使用
MYSQL 更新触发器 - 无法更新存储函数/触发器中的表,因为它已被语句使用
错误代码:1442。无法更新存储函数/触发器中的表“客户”,因为它已被调用此存储函数的语句使用