MySQL 错误 - 无法更新存储的 function/trigger 中的 table 'library_audit2',因为它已被语句使用
MySQL error - Can't update table 'library_audit2' in stored function/trigger because it is already used by statement
删除记录时出现错误。触发器哪里有问题。
Mysql代码-
MariaDB [practice2]> delimiter $$
MariaDB [practice2]> create trigger BeforeLibraryDelete1
-> BEFORE DELETE
-> ON library_audit2 FOR EACH ROW
-> BEGIN
-> declare id1 int;
-> select library_id into id1 from library_audit2 where change_date=OLD.change_date;
-> delete from library_2 where library_2.id=id1;
-> END $$
Query OK, 0 rows affected (0.128 sec)
MariaDB [practice2]> delimiter ;
MariaDB [practice2]> Delete from library_audit2 where change_date='2017-04-07';
触发删除查询时,出现错误 -
ERROR 1442 (HY000): Can't update table 'library_audit2' in stored function/trigger because it is already used by statement which invoked this stored function/trigger
您有一个针对每一行触发的删除触发器。我真的不明白从源 table 中再次选择只是为了获取要删除的行的 id。此信息已在触发器级别可用,在伪列 old.id1
.
中
这不是你想要的吗?
create trigger beforelibrarydelete1
before delete on library_audit2
for each row
begin
delete from library_2 where id = old.id;
end $$
阅读问题下的评论,您似乎正在尝试使用此触发器处理外键依赖项。如果您在 library2
中有引用 library_audit2
的子记录,那么您可以使用 on delete cascade
选项在从父 table 删除记录时自动删除它们。
create table library2 (
...
foreign key (id)
references library_audit2(id)
on delete cascade
);
删除记录时出现错误。触发器哪里有问题。
Mysql代码-
MariaDB [practice2]> delimiter $$
MariaDB [practice2]> create trigger BeforeLibraryDelete1
-> BEFORE DELETE
-> ON library_audit2 FOR EACH ROW
-> BEGIN
-> declare id1 int;
-> select library_id into id1 from library_audit2 where change_date=OLD.change_date;
-> delete from library_2 where library_2.id=id1;
-> END $$
Query OK, 0 rows affected (0.128 sec)
MariaDB [practice2]> delimiter ;
MariaDB [practice2]> Delete from library_audit2 where change_date='2017-04-07';
触发删除查询时,出现错误 -
ERROR 1442 (HY000): Can't update table 'library_audit2' in stored function/trigger because it is already used by statement which invoked this stored function/trigger
您有一个针对每一行触发的删除触发器。我真的不明白从源 table 中再次选择只是为了获取要删除的行的 id。此信息已在触发器级别可用,在伪列 old.id1
.
这不是你想要的吗?
create trigger beforelibrarydelete1
before delete on library_audit2
for each row
begin
delete from library_2 where id = old.id;
end $$
阅读问题下的评论,您似乎正在尝试使用此触发器处理外键依赖项。如果您在 library2
中有引用 library_audit2
的子记录,那么您可以使用 on delete cascade
选项在从父 table 删除记录时自动删除它们。
create table library2 (
...
foreign key (id)
references library_audit2(id)
on delete cascade
);