【问题标题】:InnoDB hierarchical data: recursively delete fragment of a treeInnoDB 分层数据:递归删除树的片段
【发布时间】:2014-06-26 07:51:54
【问题描述】:

这是我的桌子:

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,用于 pc-linux-gnu (x86_64) 使用 阅读第 5.1 行
  • 表引擎:InnoDB

【问题讨论】:

  • MySQL 没有简单的答案,因为它缺少递归查询(或可延迟的约束)

标签: mysql recursion hierarchical-data cascade


【解决方案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 |
+----+--------+

【讨论】:

  • 非常感谢,开始测试! :)
  • 哇,我知道我的错误了。我正在插入一个过程,我试图插入一条父级为 0 而不是 NULL 的记录。然后出现错误:SQLSTATE[23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败(test.pages,CONSTRAINT fk_pages_pages FOREIGN KEY(parent)参考pages (id) 删除级联)。感谢您的帮助,+1 已接受。也许它对其他有同样问题的人有用。非常感谢!
猜你喜欢
  • 2018-12-07
  • 1970-01-01
  • 2013-08-04
  • 2014-05-01
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多