ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-07-26 04:17:25  阅读:740  来源: 互联网

标签: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)的项目等等. .

假设我希望删除多个项目,所以我这样做:

从文件夹中删除WHERE folder_key IN(‘moon’,’mars’);
执行后,该表应该只有一个带有folder_key === sun的项目

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

谢谢.

解决方法:

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

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

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

标签:mysql,recursion,cascading-deletes
来源: https://codeday.me/bug/20190726/1540000.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有