我有一个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(递归)的表中的项目?
感谢。
答案 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)
使用这个模型它是不可能的
其他方式是更改数据模型,因此您可以轻松选择元素的任何后代 - 请参阅此示例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。