在mysql中,以分层方式从DB表中删除项的最佳方法是什么?
我有一个分类的数据库表。它的两列是“category\u id”和“parent\u category”,我正在使用它们进行删除。 这些列的值对齐为: e、 g.如果我删除“category_id”10,则其所有子项(任何深度)11、12、13也应删除。请给我推荐最好的mysql查询在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
提前谢谢 最简单的方法似乎是:
parent\u category
和category\u id
列之间创建外键约束李>
create table yourTable
( ...
add constraint
foreign key (parent_category)
references yourTable(category_id)
on delete cascade
)
这将不费吹灰之力完全解决您的问题。最简单的方法似乎是:
parent\u category
和category\u id
列之间创建外键约束李>
create table yourTable
( ...
add constraint
foreign key (parent_category)
references yourTable(category_id)
on delete cascade
)
这将不费吹灰之力完全解决您的问题。最简单的方法似乎是:
parent\u category
和category\u id
列之间创建外键约束李>
create table yourTable
( ...
add constraint
foreign key (parent_category)
references yourTable(category_id)
on delete cascade
)
这将不费吹灰之力完全解决您的问题。最简单的方法似乎是:
parent\u category
和category\u id
列之间创建外键约束李>
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。现在它是完美的:-)。那是空的,我不见了。