2015-06-22 18 views
1

我的一个名为成员的mysql表基本上有两列:parentIDchildID。这样我可以创建基于这两列分层树,因此,例如:当parentID和childID在同一个表上时如何删除级联?

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

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

在这种情况下,如果我想从给定的parentID中删除所有节点,我该如何实现?

回答

1

你只需要确保你已经设置了一个从子行到它的父级的外键,在外键上设置了ON DELETE CASCASDE选项。这同样适用于自引用表,因为它可以在单独的表中引用。为了删除树,只需删除父节点。所有子行都将被立即删除。

例如鉴于:

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删除:

级联操作ns可能不会嵌套深度超过15个级别

0

您是否尝试过使用mysql JOIN示例来填充yor动作。

请检查sql fiddle

我已经通过使用内部连接进行查询来设置此示例。如果您通过WHERE mem1.parentID = '2',那么它会将所有具有2的记录删除到ChildID OR或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查询将删除其中有childIDparentID = '2'和同值列。所以输出是,从member表中删除了两列。

请检查并让我知道你是否面临任何进一步的查询/关注。