我的一个名为成员的mysql表基本上有两列:parentID
和childID
。这样我可以创建基于这两列分层树,因此,例如:当parentID和childID在同一个表上时如何删除级联?
parentID, ChildID
1,2
2,3
3,4
将产生我的应用程序中的树parentID = 1
为根,2作为第一个节点,3为第二个节点, 4作为第三节点等等。
在这种情况下,如果我想从给定的parentID
中删除所有节点,我该如何实现?
我的一个名为成员的mysql表基本上有两列:parentID
和childID
。这样我可以创建基于这两列分层树,因此,例如:当parentID和childID在同一个表上时如何删除级联?
parentID, ChildID
1,2
2,3
3,4
将产生我的应用程序中的树parentID = 1
为根,2作为第一个节点,3为第二个节点, 4作为第三节点等等。
在这种情况下,如果我想从给定的parentID
中删除所有节点,我该如何实现?
你只需要确保你已经设置了一个从子行到它的父级的外键,在外键上设置了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;
然而要注意从Docs是有限制的深度CASCADE
删除:
级联操作ns可能不会嵌套深度超过15个级别
您是否尝试过使用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
查询将删除其中有childID
parentID = '2'
和同值列。所以输出是,从member
表中删除了两列。
请检查并让我知道你是否面临任何进一步的查询/关注。