Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中,以分层方式从DB表中删除项的最佳方法是什么?_Mysql_Sql - Fatal编程技术网

在mysql中,以分层方式从DB表中删除项的最佳方法是什么?

在mysql中,以分层方式从DB表中删除项的最佳方法是什么?,mysql,sql,Mysql,Sql,我有一个分类的数据库表。它的两列是“category\u id”和“parent\u category”,我正在使用它们进行删除。 这些列的值对齐为: e、 g.如果我删除“category_id”10,则其所有子项(任何深度)11、12、13也应删除。请给我推荐最好的mysql查询 提前谢谢 最简单的方法似乎是: 在parent\u category和category\u id列之间创建外键约束 将级联删除设置为on create table yourTable ( ... add co

我有一个分类的数据库表。它的两列是“category\u id”和“parent\u category”,我正在使用它们进行删除。 这些列的值对齐为:

e、 g.如果我删除“category_id”10,则其所有子项(任何深度)11、12、13也应删除。请给我推荐最好的mysql查询


提前谢谢

最简单的方法似乎是:

  • parent\u category
    category\u id
    列之间创建外键约束
  • 将级联删除设置为on

    create table yourTable
    ( ...
      add constraint
      foreign key (parent_category)
      references yourTable(category_id)
      on delete cascade
    )
    

  • 这将不费吹灰之力完全解决您的问题。

    最简单的方法似乎是:

  • parent\u category
    category\u id
    列之间创建外键约束
  • 将级联删除设置为on

    create table yourTable
    ( ...
      add constraint
      foreign key (parent_category)
      references yourTable(category_id)
      on delete cascade
    )
    

  • 这将不费吹灰之力完全解决您的问题。

    最简单的方法似乎是:

  • parent\u category
    category\u id
    列之间创建外键约束
  • 将级联删除设置为on

    create table yourTable
    ( ...
      add constraint
      foreign key (parent_category)
      references yourTable(category_id)
      on delete cascade
    )
    

  • 这将不费吹灰之力完全解决您的问题。

    最简单的方法似乎是:

  • parent\u category
    category\u id
    列之间创建外键约束
  • 将级联删除设置为on

    create table yourTable
    ( ...
      add constraint
      foreign key (parent_category)
      references yourTable(category_id)
      on delete cascade
    )
    

  • 这将毫不费力地解决您的问题。

    如果您不想使用外键,那么您可以添加列
    父路径

    ALTER TABLE `table`
    ADD `parent_path` varchar(255) NOT NULL DEFAULT ''
    AFTER `parent_category`, COMMENT='';
    
    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 ;
    现在创建一个创建父路径的过程

    ALTER TABLE `table`
    ADD `parent_path` varchar(255) NOT NULL DEFAULT ''
    AFTER `parent_category`, COMMENT='';
    
    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
    过程。

    如果不想使用外键,则可以添加列
    父路径

    ALTER TABLE `table`
    ADD `parent_path` varchar(255) NOT NULL DEFAULT ''
    AFTER `parent_category`, COMMENT='';
    
    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 ;
    现在创建一个创建父路径的过程

    ALTER TABLE `table`
    ADD `parent_path` varchar(255) NOT NULL DEFAULT ''
    AFTER `parent_category`, COMMENT='';
    
    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
    过程。

    如果不想使用外键,则可以添加列
    父路径

    ALTER TABLE `table`
    ADD `parent_path` varchar(255) NOT NULL DEFAULT ''
    AFTER `parent_category`, COMMENT='';
    
    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 ;
    现在创建一个创建父路径的过程

    ALTER TABLE `table`
    ADD `parent_path` varchar(255) NOT NULL DEFAULT ''
    AFTER `parent_category`, COMMENT='';
    
    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
    过程。

    如果不想使用外键,则可以添加列
    父路径

    ALTER TABLE `table`
    ADD `parent_path` varchar(255) NOT NULL DEFAULT ''
    AFTER `parent_category`, COMMENT='';
    
    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 ;
    现在创建一个创建父路径的过程

    ALTER TABLE `table`
    ADD `parent_path` varchar(255) NOT NULL DEFAULT ''
    AFTER `parent_category`, COMMENT='';
    
    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
    过程。

    thnx它正在工作,但我必须添加一个category_id=0的行。好的。我认为没有必要,但我不知道具体情况。这让你烦恼吗?尝试将父类设置为空。这应该行得通。因为具有0个父类ID的类别在这里是父类。这似乎是合理的。如果愿意,您也可以将它们设置为null。现在它是完美的:-)。它是空的,我丢失了。thnx它正在工作,但我必须添加一个category_id=0的行。好的。我认为没有必要,但我不知道具体情况。这让你烦恼吗?尝试将父类设置为空。这应该行得通。因为具有0个父类ID的类别在这里是父类。这似乎是合理的。如果愿意,您也可以将它们设置为null。现在它是完美的:-)。它是空的,我丢失了。thnx它正在工作,但我必须添加一个category_id=0的行。好的。我认为没有必要,但我不知道具体情况。这让你烦恼吗?尝试将父类设置为空。这应该行得通。因为具有0个父类ID的类别在这里是父类。这似乎是合理的。如果愿意,您也可以将它们设置为null。现在它是完美的:-)。它是空的,我丢失了。thnx它正在工作,但我必须添加一个category_id=0的行。好的。我认为没有必要,但我不知道具体情况。这让你烦恼吗?尝试将父类设置为空。这应该行得通。因为具有0个父类ID的类别在这里是父类。这似乎是合理的。如果愿意,您也可以将它们设置为null。现在它是完美的:-)。那是空的,我不见了。