如何以递归方式从表中删除项?

时间:2012-02-13 11:09:44

标签: mysql recursion cascading-deletes

我有一个MySQL表“文件夹”:

CREATE TABLE IF NOT EXISTS `folders` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `folder_key` varchar(40) NOT NULL,
  `parent_key` varchar(40) NOT NULL,
  `name` varchar(16) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

我不使用整数ID,只使用键(字母数字哈希,我用词替换它以使事情更清晰)。所以,folder_key& parent_key是SHA-1哈希值(在我的实际应用中)。

INSERT INTO `folders` (`id`, `folder_key`, `parent_key`, `name`) VALUES
(1, 'sun', 'root', '1'),
(2, 'moon', 'sun', '1.1'),
(3, 'jupiter', 'moon', '1.1.1'),
(4, 'mars', 'root', '2');

正如您所看到的,第一个项目也有一个parent_key,它是一个根密钥。

测试用例: 如果我希望删除folder_key === moon(1.1)的项目,它还应删除其子元素,在这种情况下,它是folder_key ==的项目= jupiter(1.1.1)等等......

我想删除多个项目,所以我这样做:

DELETE from folders WHERE folder_key IN('moon', 'mars'); 执行后,该表应只有一个folder_key === sun

的项目

所以,问题是: 如何使用MySQL触发器,ON DELETE CASCADE或......删除具有一个或多个folder_keys(递归)的表中的项目?

感谢。

4 个答案:

答案 0 :(得分:3)

您可以使用CASCADE选项在folders上添加FOREIGN KEY for DELETE:

ALTER TABLE `folders` ADD CONSTRAINT `FK_folder_parent` FOREIGN KEY `FK_folder_parent` (`parent_key`)
REFERENCES `folders` (`folder_key`)
ON DELETE CASCADE
ON UPDATE CASCADE

http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

答案 1 :(得分:3)

使用这个模型它是不可能的

  1. 而不是root使用NULL,因此您可以使用InnoDB外键+级联删除。
  2. 使用id(例如,sun = 1,moon = 2)
  3. ,而不是使用字符串parent_key

    其他方式是更改数据模型,因此您可以轻松选择元素的任何后代 - 请参阅此示例http://www.sitepoint.com/hierarchical-data-database-2/

答案 2 :(得分:2)

而不是存储“父键”值存储他们的id

CREATE TABLE IF NOT EXISTS `folders` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `folder_key` varchar(40) NOT NULL,
  `parent_key` int(11) NOT NULL,
  `name` varchar(16) NOT NULL,
  PRIMARY KEY (`id`)
foreign key(`parent_key`) on delete cascade
) ENGINE=InnoDB;

答案 3 :(得分:0)

@Naveen

创建级联删除约束时应使用相同的数据类型。现在你有一个unsigned int和一个signed int。