什么是MySQL错误1442的真正原因是什么?什么是MySQL错误1442的真正原因是什么?(wha

2019-05-12 11:02发布

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

因为它已经被用于通过调用这个存储函数/触发语句存储函数/触发无法更新表“unlucky_table”

有人说,这是MySQL的错误,还是一个一个特点,它不提供。

MySQL的触发器不能操纵他们被分配到表中。 所有其他主要DBMS支持此功能,所以希望MySQL将很快添加这种支持。

有人声称,这是由于递归的行为,当你插入一条记录MySQL是做一些锁的东西。 你不能插入/更新/删除您插入同一个表的行..因为那么触发器将一次又一次地叫。在递归结束了

在插入过程中/更新您可以访问它包含了所有在所涉及的表中的字段的新对象。 如果你插入/更新之前做和编辑要在新的对象更改的字段(S)将成为调用语句的一部分,而不是被作为单独(消除递归)执行

现在我无法理解为什么这是递归的。 我在我有2和表的情况下, table1table2以及我运行SQL查询如

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

现在我有一个after update triggertable1

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?

Answer 1:

更新时,它不能引用表。

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

从MySQL的文档:

触发器可以在自己的表访问新老数据。 触发器也可以影响其他表,但不允许修改已被使用(读或写)由调用函数或触发器的语句的表。 (MySQL的5.0.10之前,触发器不能修改其他表。)


文章来源: what is the real cause of mysql error 1442?