MySQL触发器:删除同一表中的相关行

rxztt3cl  于 2023-02-03  发布在  Mysql
关注(0)|答案(1)|浏览(157)

我在MySQL中创建了一个触发器来删除依赖于OLD行的所有行,有些菜单项可以是子菜单项,因此menu_in字段具有父项menu_id。

CREATE TRIGGER DEL_MENU_DEPENDENCIES 
 BEFORE DELETE ON menu
 FOR EACH ROW BEGIN
   DELETE FROM menu WHERE menu_in = OLD.menu_id;
 END

但我得到一个错误:
一般错误:1442 1442无法更新存储函数/触发器中的表格'menu',因为它已被调用此存储函数/触发器的语句使用
我已经尝试了"AFTER",但问题相同。
以下是表中的字段:

menu_id | menu_in | name

我在谷歌上搜索了一下,但是没有找到解决方案,看起来好像是和无限循环的可能性有关,但是很明显,如果没有更多的行,循环就会停止,对吗?
提前感谢您的关注。
编辑

+---------+---------+------+
| menu_id | menu_in | name |
+---------+---------+------+
|    1    |    0    | mn1  |
+---------+---------+------+
|    2    |    0    | mn2  |
+---------+---------+------+
|    3    |    1    | mn3  |
+---------+---------+------+
|    4    |    1    | mn4  |
+---------+---------+------+
|    5    |    4    | mn5  |
+---------+---------+------+
|    6    |    2    | mn6  |
+---------+---------+------+
|    7    |    5    | mn7  |
+---------+---------+------+

假设我需要删除menu_id = 1的行,它将删除第3、4、5和7行,因为它们创建了一个链,在MySQL中使用触发器来完成这一操作会很棒,我只需要删除一行,触发器会完成其余的工作。
谢谢你。

a64a0gku

a64a0gku1#

在MySQL或MariaDB中,不能使用触发器执行此操作。
https://dev.mysql.com/doc/refman/en/stored-program-restrictions.html表示:
存储函数或触发器不能修改已由调用该函数或触发器的语句使用(用于读取或写入)的表。
您可以通过使用带有ON DELETE CASCADE选项的外键来完成您所描述的内容。有关详细信息,请参阅www.example.com。https://dev.mysql.com/doc/refman/en/create-table-foreign-keys.html#foreign-key-referential-actions for details.

相关问题