首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用层次结构方式从mysql中的DB表中删除项的最佳方法是什么?

问用层次结构方式从mysql中的DB表中删除项的最佳方法是什么?
EN

Stack Overflow用户
提问于 2014-07-04 14:08:31
回答 2查看 154关注 0票数 1

我有一个分类的数据库表。它的两个列是'category_id‘和'parent_category’,我正在使用它们来删除。这些列的值对齐如下:

​

​

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

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-04 14:26:27

最简单的方法似乎是这样:

  1. 在parent_category和category_id列之间创建外键约束;
  2. 设置级联删除。 创建表yourTable ( ..在删除级联上添加约束外键(parent_category)引用yourTable(category_id) )

这将解决你的问题完全不费力气。

票数 3
EN

Stack Overflow用户

发布于 2014-07-04 14:47:00

如果不想使用外键,则可以添加列parent_path

代码语言:javascript
复制
ALTER TABLE `table`
ADD `parent_path` varchar(255) NOT NULL DEFAULT ''
AFTER `parent_category`, COMMENT='';

现在创建一个创建parent_path的过程

代码语言:javascript
复制
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 ;

调用这个过程

代码语言:javascript
复制
CALL UpdateParentPath();

而现在..。终于..。你开始删除

代码语言:javascript
复制
DELETE FROM `table` WHERE `parent_category` = '9' OR `parent_path` LIKE '%,9,%'

在每次删除之前或之后插入/更新都必须调用UpdateParentPath过程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24576134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档