我在MySQL中有一个通过"parent_id“列连接的项目列表。
让我们假设这些列是: id、name、parent_id
如果我的一个用户删除了层次结构中较高的一个项目,我需要删除它的所有子项。所以,有两个部分的问题:
1)是否有一个有效且高效的MySQL调用,可以为父项不再存在的所有项返回ID?
2)在PHP中,我想我可以将这些孤立的ID从MySQL放入一个数组中,然后运行foreach循环并删除每个ID。
非常感谢你的帮助。
发布于 2009-04-02 00:19:18
如果您使用的是InnoDB,那么在设置外键关系时,您应该查看Foreign Key Constraints,它会通过使用ON DELETE CASCADE选项为您解决这个问题。
文档中的一个示例:
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;现在,如果您要添加一个父行和一个匹配的子行,如下所示:
INSERT INTO parent (id) VALUES (1);
INSERT INTO child (id, parent_id) VALUES (1,1);然后像这样删除父级:
DELETE FROM parent WHERE id = 1;您将发现匹配子记录已消失。在我看来,这是最好的方法。
编辑:要在1个表中执行此操作,请执行以下操作:
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然后,如果添加两行,一行引用另一行:
INSERT INTO parent (id,name,parent_id)
VALUES ('1', 'Test 1', NULL), ('2', 'Test 2', '1')然后删除这两行中的父行:
DELETE FROM parent WHERE id = 1;您会发现它删除了parent_id为1的子行。
发布于 2009-04-03 00:44:14
如果您的数据是线性分层的(每个节点只有一个父关系),并且是高读低写的,那么您可以考虑将其迁移到修改后的Preorder Tree遍历结构中。这听起来很可怕,但实际上很整洁。这里有一篇很棒的文章:http://www.sitepoint.com/article/hierarchical-data-database/1/
从这样的结构中检索数据不仅非常高效(只需执行一次SELECT操作,即可获得所有子项),还可以在一条delete语句中删除树的整个分支。
发布于 2009-04-02 00:24:58
RIGHT JOINS通常用于查找其他数据库中的孤立项。但是,使用左连接也是可能的。
Here is这是一篇关于在MySQL中获取孤立行的布局非常好的文章
https://stackoverflow.com/questions/707851
复制相似问题