6

好吧,我已经在互联网上寻找了很多地方的原因,mysql error #1442其中说

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

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

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

有人声称这是由于 插入记录时的递归行为 mysql 正在执行一些锁定操作。你不能插入/更新/删除你插入的同一个表的行..因为那样触发器会一次又一次地调用..以递归结束

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

现在我不明白为什么这是递归的。我有一个案例,我有 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?
4

1 回答 1

4

更新时不能引用表。

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

来自MySQL 文档:

触发器可以访问自己表中的旧数据和新数据。触发器也可以影响其他表,但不允许修改已被调用函数或触发器的语句使用(用于读取或写入)的表。(在 MySQL 5.0.10 之前,触发器不能修改其他表。)
于 2011-07-20T02:50:30.613 回答