我在 MySQL 中有无限级别的菜单结构,其中父元素和子元素通过列 p_id
连接:
+----+------+------+----------------+
| id | p_id | sort | name_en |
+----+------+------+----------------+
| 1 | 0 | 1 | menu-1 |
| 2 | 0 | 2 | menu-2 |
| 3 | 0 | 6 | menu-3 |
| 4 | 2 | 3 | sub-menu-2-1 |
| 5 | 2 | 4 | sub-menu-2-2 |
| 6 | 5 | 5 | sub-menu-2-2-1 |
+----+------+------+----------------|
删除带有子菜单元素的根菜单元素的最佳实践是什么?
我可以通过 PHP 递归来实现它,但它会导致一些查询。
所以我需要找出是否有任何可能的方法可以通过一个 MySQL 查询来做到这一点。
最佳答案
既然你有name_en
,你不能用它来删除行吗?例如,
DELETE FROM `table` WHERE `id` = 2 OR `name_en` LIKE 'sub-menu-2-%'
新方法:
您可以使用 Foreign Key有约束。我创建了你的表并将其命名为树列表,
CREATE TABLE `treelist` (
`item_id` int(10) unsigned NOT NULL auto_increment,
`parent_id` int(10) unsigned default NULL,
`name_en` varchar(40) NOT NULL,
PRIMARY KEY (`item_id`),
KEY `FK_parent_id` (`parent_id`),
CONSTRAINT `FK_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `treelist` (`item_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后我添加了一些测试数据,即您问题中的数据,
INSERT INTO `treelist` (`item_id`, `parent_id`, `name_en`) VALUES (NULL, NULL, 'Menu 1'), (NULL, NULL, 'Menu 2'), (NULL, NULL, 'Menu 3'), (NULL, 2, 'Sub Menu 2-1'), (NULL, 2, 'Sub Menu 2-2'), (NULL, 5, 'Sub Menu 2-2-1');
现在,例如,当您删除一行时
DELETE FROM `treelist` WHERE `item_id` = 2
它也会删除所有子代、孙子等。之后表格看起来像,
+----+------+----------------+
| id | p_id | name_en |
+----+------+----------------+
| 1 | NULL | Menu 1 |
| 3 | NULL | Menu 3 |
+----+------+----------------+
关于php - 如何在MySQL中删除带有子级的多级菜单项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25233734/