当前位置: 首页 > 面试题库 >

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

刘阳荣
2023-03-14
问题内容

我正在使用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 -无法更新存储函数/触发器中的表“需求”,因为调用该存储函数/触发器的语句已使用该表。

我已经在Internet上寻找了此错误,但这是我第一次使用SQL触发器,所以我没有成功解决问题。谢谢你的帮助。


问题答案:

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

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

还可以编写一个新的存储过程来每隔5/10分钟(无论需要什么)来修复您的数据向导。



 类似资料:
  • 问题内容: 我正在运行MySQL查询。但是,当从表单输入添加新行时,出现此错误: 从代码: 这个错误是什么意思? 问题答案: INSERT触发器触发时,您无法更改表。INSERT可能会进行一些锁定,这可能导致死锁。同样,从触发器更新表将导致同一触发器在无限递归循环中再次触发。这两个原因都是MySQL阻止您执行此操作的原因。 但是,根据要实现的目标,您可以使用NEW.fieldname甚至旧值(如果

  • 我正在运行一个MySQL查询。但当从表单输入中添加新行时,我会得到以下错误: 从代码: 这个错误意味着什么?

  • 问题内容: 我有一个想要的表:更新该表后,该表的2个字段(标题和描述)会发生变化,并从另一个表中获取价值 这是我的触发器: 我的表: trade_request_type trade_request 错误: 错误1442:无法更新存储函数/触发器中的表’trade_request’,因为调用该存储函数/触发器的语句已使用该表。 这没用!什么是概率? 问题答案: 使用检查null值。 要更改更新后的

  • 问题内容: 我有以下触发器: 它将表格的和列相加,然后将它们除以总的综合浏览量。 每当我尝试向新闻添加新行时,都会出现以下错误: 触发对我来说似乎很简单。触发器无法运行是有原因的吗? 问题答案: 该 症状 是,你正在运行一个内部(所有行)触发-无论是修改表,这是不允许的。 就是说,如果我正确地想到了触发器的意图,则您不想更新 所有 行,而只希望更新新插入的行。您可以轻松实现 请注意,这是一个触发器

  • userNotesTable: 用户提醒表: 插入触发器: 更新触发器: 这是数据库的当前代码,以及提醒表的特定触发器。我遇到的困难是,从提醒表中的specific中的user notes表中选择特定的名称和额外的内容,所有这些都在更新触发器中。 插入时,和会被插入到提醒和搜索表中,但我希望能够使用特定名称和用户注释表中的额外内容更新搜索表,这可能吗?

  • Azure函数存储帐户Blob容器触发器 在我们的一个用例中,我正在为具有以下条件的存储帐户容器中的任何活动寻找Azure函数触发器 < li >具有特定命名约定的容器(名称如xxxx-input) < li >它应该自动检测是否创建了新的容器(具有特定的命名约定) < li>