InnoDB分层数据:递归删除树的片段

时间:2014-06-26 07:51:55

标签: mysql recursion hierarchical-data cascade

这是我的表:

CREATE TABLE `pages` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `parent` int(11) DEFAULT NULL,
    `label` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

其中id是唯一的id(自动增量),而parent也是同一个表中的id。如果parent为NULL,则页面没有父级。

我想要的是什么?如果我删除了一个父级,它应该自动删除同一个表中的所有孩子。 我相信这可以在DELETE CASCADE上使用,这就是我想要这样做的方式:)。但是我已经尝试了很多代码配置,但没有一个能够工作。无法创建表,或者插入查询无法正常工作,因为错误看起来类似于"键不存在"。


我发现了什么?

How to recursively delete items from table? - 答案很棒,但没有代码。这回答了同样的问题: https://stackoverflow.com/a/9260373/1125465对我不起作用。表创建存在一些问题。我认为这个答案是匆忙做出的,并且有一些关键词缺失了吗?

Recursive MySQL Query with relational innoDB这个是相似的,但情况不一样,表格很少。

Sql server - recursive delete - 来吧,必须有一个最简单的答案......


技术信息:

  • mysql Ver 14.14 Distrib 5.1.70,for pc-linux-gnu(x86_64)using readline 5.1
  • 表引擎:InnoDB

1 个答案:

答案 0 :(得分:1)

这适合我(这里是一个小提琴http://sqlfiddle.com/#!8/d15b4/1):

CREATE TABLE
        test
        (
        id INT NOT NULL PRIMARY KEY,
        parent INT,
        CONSTRAINT
                fk_test_test
        FOREIGN KEY
                (parent)
        REFERENCES
                test (id)
        ON DELETE CASCADE
        );

INSERT
INTO    test
VALUES  (1, NULL),
        (2, 1),
        (3, 2),
        (4, 3),
        (5, NULL),
        (6, 5);

SELECT  *
FROM    test;

+----+--------+
| id | parent |
+----+--------+
|  1 |   NULL |
|  5 |   NULL |
|  2 |      1 |
|  3 |      2 |
|  4 |      3 |
|  6 |      5 |
+----+--------+

DELETE
FROM    test
WHERE   id = 1;

SELECT  *
FROM    test;

+----+--------+
| id | parent |
+----+--------+
|  5 |   NULL |
|  6 |      5 |
+----+--------+