我在MySQL中具有无限级别的菜单结构,其中父元素和子元素与column连接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-%'
新方法:
您可以将外键与约束一起使用。我创建了您的表格并将其称为树列表,
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 |
+----+------+----------------+
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句