一尘不染

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

mysql

嗯,我已经找了很多地方在互联网上的原因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?

阅读 2033

收藏
2020-05-17

共1个答案

一尘不染

更新表时不能引用该表。

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

MySQL文档:

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

2020-05-17