从mysql中的DB表中以层次结构方式删除项目的最佳方法?

时间:2014-07-04 14:08:32

标签: mysql sql

我有一个类别的数据库表。它的两个列是'category_id'和'parent_category',我将其用于删除。 这些列的值对齐为:

enter image description here

e.g。如果我删除'category_id'10那么它的所有子节点(到任何深度)11,12,13也应该被删除。请建议我最好的mysql查询。

提前谢谢。

2 个答案:

答案 0 :(得分:3)

最简单的方法似乎是:

  1. parent_categorycategory_id列之间创建外键约束;
  2. 设置级联删除。

    create table yourTable
    ( ...
      add constraint
      foreign key (parent_category)
      references yourTable(category_id)
      on delete cascade
    )
    
  3. 这将毫不费力地解决您的问题。

答案 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过程。