php - 删除层次结构中的孤立项

标签 php mysql

我在 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/

相关文章:

java - JdbcRowSet、CachedRowSet 和 WebRowSet 的区别

Php - 如何从 mysql 中排除数据

php - Mysql concat不等表字段

php - 奇怪的 500 内部服务器错误(firebug、php、display_errors、ajax)

php - Laravel: Blade foreach 循环引导列

php - Codeigniter- 即使在页面加载或刷新时也将空白行插入到 mysql 中

mysql - 向表中添加或删除列会强制重新创建所有索引吗?

javascript - 使用 ajax 和 php 将文本文件转换为 2d javascript 数组

php - PHP中如何使用next()遍历数组(NULL=>NULL, FALSE=>FALSE)

java - 如何使用 MySQL Connector/J 直接检索 UTC OffsetDateTime?