我在 MySQL 中有一个项目列表,通过“parent_id”列连接。
假设列是:id, name, parent_id
如果我的一个用户删除了层次结构中较高的项目,我需要删除它的所有子项。所以,两部分问题:
1) 是否有一个有效且高效的 MySQL 调用将返回其父项不再存在的所有项的 ID?
2) 在 PHP 中,我想我可以将这些孤立的 ID 从 MySQL 获取到一个数组中,然后运行一个 foreach 循环并删除每个 ID?
非常感谢您的帮助。
最佳答案
如果您使用的是 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 的子行。
关于php - 删除层次结构中的孤立项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/707851/