如何递归地从表中删除项目?
我有一个 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) 的项目,它还应该删除其子元素,在本例中它是带有 < code>folder_key === jupiter
(1.1.1) 等等...
假设我希望删除多个项目,所以我这样做:
从文件夹中删除,其中folder_key IN('月球', '火星');
执行后,表中应该只有一项 folder_key
=== sun
所以,问题是: 如何使用MySQL触发器、ON DELETE CASCADE或...从具有一个或多个folder_keys(递归地)的表中删除项目?
谢谢。
I've a MySQL table "folders":
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;
I don't use integer IDs, only keys (alphanumeric hashes, which I've replaced with words to make things more clear). So, folder_key
& parent_key
are SHA-1 hashes (in my real application).
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');
As you can see the first item has a parent_key too, it's a root key.
The test case:
If I wish to delete an item with folder_key
=== moon
(1.1), it should also delete its children element(s), in this case it's an item with folder_key
=== jupiter
(1.1.1) and so on...
Let say I wish to delete multiple items, so I do:
DELETE from folders WHERE folder_key IN('moon', 'mars');
After execution, the table should have only one item with folder_key
=== sun
So, the question is:
How to delete items from that table having one or more folder_keys (recursively) with MySQL triggers, ON DELETE CASCADE or ... ?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
使用这种模型是不可能的
另一种方法是更改数据模型,这样您就可以轻松选择元素的任何后代 - 例如请参见 http://www.sitepoint.com/hierarchical-data-database-2/
With this model it is imposibble
Other way is to change data model, so you can easly select any descendands of element - see this for example http://www.sitepoint.com/hierarchical-data-database-2/
您可以使用用于删除的 CASCADE 选项在
文件夹
上添加外键:http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
You can add a FOREIGN KEY on
folders
with CASCADE option for DELETE:http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
不存储“父密钥”值,而是存储其 id
Instead of storing the "Parent key" value store their id
@Naveen,
创建级联删除约束时应该使用相同的数据类型。现在你有了一个 unsigned int 和一个signed int。
@Naveen
you should use the same datatypes when creating a cascade delete constraint. Now you have an unsigned int and a signed int.