我是一个名为members的mysql表,基本上有两列:parentID
和childID
。这样我就可以根据这两列创建一个分层树,例如:
parentID, ChildID
1,2
2,3
3,4
将在我的应用程序中生成一个树,其中parentID = 1
为根,2为第一个节点,3为第二个节点,4为第三个节点,等等。
如果我想在这种情况下删除给定parentID
的所有节点,我该如何做到这一点?
答案 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;
但请注意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)
基本上,有两种方法:
SELECT ChildID FROM MyTable WHERE parentID = ?
您可以通过此SQL获取ChildID的列表,然后再次运行该SQL,并将ChildID的列表作为“ parentID”,直到得到一个空列表。之后,将其全部删除
DELETE FROM MyTable WHERE ChildID = ?
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 = ?