使用之前行中的id删除多行

时间:2017-08-08 15:06:42

标签: mysql

我试图在我的数据库中创建文件夹和文件系统。

在删除文件夹 子文件夹的同时,还应该从我的其他表(files_plus)中删除该文件夹中的相应文件。但是如何删除文件夹,它的子文件夹以及文件夹和子文件夹中包含的所有文件?

表:files_plus:

-----------------------------
| id  |  name  |  parentid  |
-----------------------------

(" parentid"是" id"来自folders_plus表。)

表:folders_plus

SQL Table example

我无法想出任何构建查询的方法,那么我将如何设法做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以添加外键约束并将其设置为“CASCADE DELETE”,如下所示folders_plus表。

ALTER TABLE `folders_plus` 
ADD INDEX `folders_plus_parentid_idx` (`parentid` ASC);
ALTER TABLE `folders_plus` 
ADD CONSTRAINT `fk_folders_plus_id_folders_plus_parentid`
  FOREIGN KEY (`parentid`)
  REFERENCES `folders_plus` (`id`)
  ON DELETE CASCADE
  ON UPDATE NO ACTION;

对于files_plus表:

ALTER TABLE `files_plus` 
ADD INDEX `fk_files_plus_id_folders_plus_parentid_idx` (`parentid` ASC);
ALTER TABLE `files_plus` 
ADD CONSTRAINT `fk_files_plus_id_folders_plus_parentid`
  FOREIGN KEY (`parentid`)
  REFERENCES `folders_plus` (`id`)
  ON DELETE CASCADE
  ON UPDATE NO ACTION;

删除父行时,它也会删除所有子行。

确保您的parentid列可以为空,并且每个顶级目录都为空。每个非空的parentid都必须作为folders_plus表中的id存在。

PS:请注意,为了使外键约束起作用,您的database storage engine应该是InnoDB。

答案 1 :(得分:0)

  1. 使用户ID和parentid相同类型(我猜测INT(10)UNSIGNED)
  2. 允许NULL值为parentid
  3. UPDATE表SET parentid = NULL WHERE parentid = 0
  4. 从parentid到userid创建外键
  5. 创建外键时" ON DELETE"到" CASCADE" - 这将导致所有具有已删除的parentID的项目也将被删除。