【问题标题】:MySQL error - Can't update table 'library_audit2' in stored function/trigger because it is already used by statementMySQL 错误 - 无法更新存储函数/触发器中的表“library_audit2”,因为它已被语句使用
【发布时间】:2021-02-20 15:23:39
【问题描述】:

删除记录时出现错误。触发器的问题在哪里。

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

【问题讨论】:

  • 好吧,你不能从触发器修改触发器定义的表。但是,我不明白触发器应该做什么,因此无法提出解决方案。
  • 我正在从包含外键的表中删除一条记录。为了避免外键错误,我定义了一个 BEFORE DELETE 触发器,它将从另一个包含主键的表中删除相同的记录。 @影子
  • 这看起来不合逻辑。为您的表显示完整的 CREATE TABLE、一些数据示例和删除过程 - 删除了哪些行、所需的最终状态以及原因。

标签: mysql sql triggers sql-delete


【解决方案1】:

您有一个为每一行触发的删除触发器。我真的没有看到从源表中再次选择只是为了获取被删除行的 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 选项在从父表中删除记录时自动删除它们。

create table library2 (
    ...
    foreign key (id)
        references library_audit2(id)
        on delete cascade
);

【讨论】:

  • 其实是想学一个触发器的概念所以没用on delete cascade。但它抛出了错误。在您的解决方案中,我将 old.id1 替换为 old.id 然后它起作用了。感谢您的解决方案。
猜你喜欢
  • 2021-07-09
  • 2013-02-24
  • 2015-02-13
  • 2017-08-11
  • 1970-01-01
  • 2019-05-20
  • 2020-03-10
  • 2015-11-03
  • 2022-11-17
相关资源
最近更新 更多