首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除层次结构中的孤立项

问删除层次结构中的孤立项
EN

Stack Overflow用户
提问于 2009-04-02 00:18:14
回答 4查看 851关注 0票数 2

我在MySQL中有一个通过"parent_id“列连接的项目列表。

让我们假设这些列是: id、name、parent_id

如果我的一个用户删除了层次结构中较高的一个项目,我需要删除它的所有子项。所以,有两个部分的问题:

1)是否有一个有效且高效的MySQL调用,可以为父项不再存在的所有项返回ID?

2)在PHP中,我想我可以将这些孤立的ID从MySQL放入一个数组中,然后运行foreach循环并删除每个ID。

非常感谢你的帮助。

EN

回答 4

Stack Overflow用户

发布于 2009-04-02 00:19:18

如果您使用的是InnoDB,那么在设置外键关系时,您应该查看Foreign Key Constraints,它会通过使用ON DELETE CASCADE选项为您解决这个问题。

文档中的一个示例:

代码语言:javascript
复制
CREATE TABLE parent (id INT NOT NULL,
                     PRIMARY KEY (id)) ENGINE=INNODB;

CREATE TABLE child (id INT, parent_id INT,
                    INDEX par_ind (parent_id),
                    FOREIGN KEY (parent_id) REFERENCES parent(id)
                    ON DELETE CASCADE) ENGINE=INNODB;

现在,如果您要添加一个父行和一个匹配的子行,如下所示:

代码语言:javascript
复制
INSERT INTO parent (id) VALUES (1);
INSERT INTO child (id, parent_id) VALUES (1,1);

然后像这样删除父级:

代码语言:javascript
复制
DELETE FROM parent WHERE id = 1;

您将发现匹配子记录已消失。在我看来,这是最好的方法。

编辑:要在1个表中执行此操作,请执行以下操作:

代码语言:javascript
复制
CREATE TABLE parent (
    id INT NOT NULL,
    name varchar(250) not null,
    parent_id INT NULL,
    FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE,
    PRIMARY KEY (id)
) ENGINE=INNODB

然后,如果添加两行,一行引用另一行:

代码语言:javascript
复制
INSERT INTO parent (id,name,parent_id)
VALUES ('1', 'Test 1', NULL), ('2', 'Test 2', '1')

然后删除这两行中的父行:

代码语言:javascript
复制
DELETE FROM parent WHERE id = 1;

您会发现它删除了parent_id为1的子行。

票数 4
EN

Stack Overflow用户

发布于 2009-04-03 00:44:14

如果您的数据是线性分层的(每个节点只有一个父关系),并且是高读低写的,那么您可以考虑将其迁移到修改后的Preorder Tree遍历结构中。这听起来很可怕,但实际上很整洁。这里有一篇很棒的文章:http://www.sitepoint.com/article/hierarchical-data-database/1/

从这样的结构中检索数据不仅非常高效(只需执行一次SELECT操作,即可获得所有子项),还可以在一条delete语句中删除树的整个分支。

票数 2
EN

Stack Overflow用户

发布于 2009-04-02 00:24:58

RIGHT JOINS通常用于查找其他数据库中的孤立项。但是,使用左连接也是可能的。

Here is这是一篇关于在MySQL中获取孤立行的布局非常好的文章

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/707851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档