当parentID和childID在同一个表上时如何删除级联?

时间:2015-06-22 06:04:48

标签: mysql cascade

我是一个名为members的mysql表,基本上有两列:parentIDchildID。这样我就可以根据这两列创建一个分层树,例如:

parentID, ChildID
1,2
2,3
3,4

将在我的应用程序中生成一个树,其中parentID = 1为根,2为第一个节点,3为第二个节点,4为第三个节点,等等。

如果我想在这种情况下删除给定parentID的所有节点,我该如何做到这一点?

3 个答案:

答案 0 :(得分:1)

您只需要确保已将子行中的外键设置为其父键,并在外键上设置ON DELETE CASCASDE选项。这同样适用于自引用表,就像它对单独表中的引用一样。要删除树,只需删除父节点。将立即删除所有子行。

e.g。给出:

CREATE TABLE MyTable
(
  ID INT NOT NULL PRIMARY KEY,
  ParentID INT  NULL,
  CONSTRAINT FK_MT_Parent FOREIGN KEY (ParentID) REFERENCES MyTable(ID) ON DELETE CASCADE
);

-- And inserting two trees of data:
-- 1-2-3
--   └-4
-- 10 - 11
INSERT INTO MyTable(ID,ParentID) VALUES
    (1,null), (2,1), (3,2), (4,2),
    (10,null), (11,10);

我们可以通过简单地删除根节点来删除整个第一棵树:

DELETE FROM MYTable WHERE ID = 1;

SqlFiddle of same

但请注意Docs CASCADE删除的深度有限:

  

级联操作可能不会嵌套超过15级

答案 1 :(得分:0)

您是否尝试使用mysql JOIN示例来填充您的行动。

请查看sql fiddle

我已使用内部联接通过查询设置此示例。如果您传递WHERE mem1.parentID = '2',那么它将删除所有包含2个ChildID的记录或删除到parentID字段。

DELETE mem2.* FROM
  member mem1
  INNER JOIN member mem2 ON mem2.ChildID = mem1.parentID OR mem1.parentID = mem2.parentID
  WHERE mem1.parentID = '2';

以上DELETE查询会删除在parentID = '2'中具有childID和相同值的列。因此,输出是从member表中删除的两列。

如果您有任何进一步的疑问/疑虑,请检查并告诉我。

答案 2 :(得分:0)

基本上,有两种方法:

  1. 递归循环并查找所有需要删除的记录
    SELECT ChildID FROM MyTable WHERE parentID = ?
    
    您可以通过此SQL获取ChildID的列表,然后再次运行该SQL,并将ChildID的列表作为“ parentID”,直到得到一个空列表。之后,将其全部删除
    DELETE FROM MyTable WHERE ChildID = ?
    
  2. 使用nested set model。您可以在互联网上找到许多教程,例如:managing hierachical data in my sql。然后,您可以删除所需的内容:
    DELETE w FROM MyTable w 
    INNER JOIN MyTable parent
    ON w.parentID = parent.ChildID
    WHERE w.lft BETWEEN parent.lft AND parent.rgt
        AND parent.parentID = ?
    
相关问题