我在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中使用触发器来完成这一操作会很棒,我只需要删除一行,触发器会完成其余的工作。
谢谢你。
1条答案
按热度按时间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.