我有一个类别的数据库表。它的两个列是'category_id'和'parent_category',我将其用于删除。 这些列的值对齐为:
e.g。如果我删除'category_id'10那么它的所有子节点(到任何深度)11,12,13也应该被删除。请建议我最好的mysql查询。
提前谢谢。答案 0 :(得分:3)
最简单的方法似乎是:
parent_category
和category_id
列之间创建外键约束; 设置级联删除。
create table yourTable
( ...
add constraint
foreign key (parent_category)
references yourTable(category_id)
on delete cascade
)
这将毫不费力地解决您的问题。
答案 1 :(得分:0)
如果您不想使用外键,则可以添加列parent_path
ALTER TABLE `table`
ADD `parent_path` varchar(255) NOT NULL DEFAULT ''
AFTER `parent_category`, COMMENT='';
现在创建一个创建parent_path
DELIMITER $$
DROP PROCEDURE IF EXISTS UpdateParentPath$$
CREATE PROCEDURE UpdateParentPath()
BEGIN
DECLARE count INT;
SET count = 1;
WHILE count > 0 DO
UPDATE `table` as `t`
LEFT JOIN `table` as `p` ON `t`.`parent_category` = `p`.`category_id`
SET `t`.`parent_path` = CONCAT(`p`.`parent_path`, IF(`p`.`parent_path` = '', '', ','), `p`.`category_id`);
SELECT ROW_COUNT() INTO count;
END WHILE;
END$$
DELIMITER ;
调用此程序
CALL UpdateParentPath();
现在......终于......你开始删除
DELETE FROM `table` WHERE `parent_category` = '9' OR `parent_path` LIKE '%,9,%'
在每次删除之前或在插入/更新之后都需要调用UpdateParentPath
过程。