如何递归地从表中删除项目?

发布于 2025-01-04 15:31:54 字数 1086 浏览 5 评论 0原文

我有一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

双手揣兜 2025-01-11 15:31:55

使用这种模型是不可能的

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

另一种方法是更改​​数据模型,这样您就可以轻松选择元素的任何后代 - 例如请参见 http://www.sitepoint.com/hierarchical-data-database-2/

With this model it is imposibble

  1. Instead of root use NULL , so you can use InnoDB Foreign Key + Cascade Delete.
  2. Instead of using string parent_key, use id ( eg. sun = 1, moon = 2 )

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/

虐人心 2025-01-11 15:31:55

您可以使用用于删除的 CASCADE 选项在文件夹上添加外键:

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

You can add a FOREIGN KEY on folders with CASCADE option 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

烛影斜 2025-01-11 15:31:55

不存储“父密钥”值,而是存储其 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;

Instead of storing the "Parent key" value store their 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;
相守太难 2025-01-11 15:31:55

@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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文