mysql错误1442的真正原因是什么?
嗯,我已经找了很多地方在互联网上的原因mysql error #1442
,其称
无法更新存储函数/触发器中的表“ unlucky_table”,因为调用该存储函数/触发器的语句已使用该表
有人说这是mysql中的错误或它没有提供的功能。
MySQL触发器无法操纵分配给它们的表。所有其他主要的DBMS都支持此功能,因此希望MySQL会尽快添加此支持。
有人声称这是由于当您插入一条记录时递归行为
mysql正在做一些锁定操作。您不能在要插入的表的同一行中插入/更新/删除行。因为那样触发器将一次又一次地被调用..最终以递归方式结束
在插入/更新期间,您可以访问NEW对象,该对象包含所涉及表中的所有字段。如果您在插入/更新之前进行编辑,然后在新对象中编辑要更改的字段,它将成为调用语句的一部分,而不是单独执行(消除递归)
现在我不明白为什么这是递归的。我有一个案例,其中我有2个表table1
,table2
并且我以
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 table1FOR 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之前,触发器无法修改其他表。)
以上是 mysql错误1442的真正原因是什么? 的全部内容, 来源链接: utcz.com/qa/435430.html