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

mysql错误1442的真正原因是什么?

公良奇
2023-03-14
问题内容

嗯,我已经找了很多地方在互联网上的原因mysql error #1442,其称

无法更新存储函数/触发器中的表“ unlucky_table”,因为调用该存储函数/触发器的语句已使用该表

有人说这是mysql中的错误或它没有提供的功能。

MySQL触发器无法操纵分配给它们的表。所有其他主要的DBMS都支持此功能,因此希望MySQL会尽快添加此支持。

有人声称这是由于当您插入一条记录时递归行为
mysql正在做一些锁定操作。您不能在要插入的表的同一行中插入/更新/删除行。因为那样触发器将一次又一次地被调用..最终以递归方式结束

在插入/更新期间,您可以访问NEW对象,该对象包含所涉及表中的所有字段。如果您在插入/更新之前进行编辑,然后在新对象中编辑要更改的字段,它将成为调用语句的一部分,而不是单独执行(消除递归

现在我不明白为什么这是递归的。我有一个案例,其中我有2个表table1table2并且我以

update table1 set avail = 0 where id in (select id from table2 where duration < now() - interval 2 hour);

现在我有一个after update trigger关于table1

CREATE TRIGGER trig_table1 AFTER UPDATE ON table1
FOR EACH ROW begin
if old.avail=1 and new.avail=0 then
delete from table2 where id=new.id;
end if;

现在,当我执行更新查询时,出现了1442错误。在这种情况下递归是什么?

is this error a lack of feature in mysql?
OR
does this have to do with how mysql executes queries?
OR
is there something logically wrong with executing such queries?

问题答案:

更新表时不能引用该表。

/* my sql does not support this */
UPDATE tableName WHERE 1 = (SELECT 1 FROM tableName)

从MySQL文档:

触发器可以访问其自己的表中的旧数据和新数据。触发器还可以影响其他表,但是不允许修改调用该函数或触发器的语句已经使用(用于读取或写入)的表。(在MySQL
5.0.10之前,触发器无法修改其他表。)



 类似资料:
  • 我对编程很陌生,我已经自学了将近一个月了,有谁能给我解释一下我代码中错误的原因吗?在“Total(moneyConv(moneySum*moneyRate))”中出错。行,表示实际和形式的论点在长度上是不同的。我检查了我所有的参数,我觉得很好。多谢!

  • 我有一个wordpress博客。当我登录到仪表板时,以下异常在顶部突出显示: 从异常消息中,我可以推断它与谷歌分析及其API有关 然而,我很想知道是什么导致了这个异常。此外,我可以采取哪些措施来避免此类例外情况?

  • minecraft 1.8.8的modcoderpack918中的有一个很大的问题。我的Java版本是1.8.0_271-B09。 我不知道我必须做什么。

  • 您好。很感谢贵方在百忙中查看此信息,谢谢! 问题如下: 1、我使用 vue create myproject 创建了 vue3.x 的项目,选择了 typescript,然后安装了 npm i element-plus --save,配置好 main.ts,运行 npm run serve 是正常的; 2、未添加其他新的页面,使用 npm run build 打包,出现如下图的错误提示: pack

  • 问题内容: 当我尝试运行程序时,出现以下错误 请帮忙 问题答案: 从Javadoc: 如果Java虚拟机找不到声明为native的方法的适当本机语言定义,则抛出该异常。 这是与JNI相关的错误。loadJacobLibrary试图加载名为jacob-1.14.3-x86的本机库,但在java.library.path定义的路径上找不到该库。启动JVM时,应将此路径定义为系统属性。例如 在Windo

  • 在这里抛出RejectedExecutionException是否有其他原因? java.util.concurrent.RejectedExecutionException:任务java.util.concurrent.FutureTask@4194a5f0被java.util.concurrent.ThreadPoolExecutor@41a36e90拒绝[终止,池大小=0,活动线程=0,排队