我有一个表,用于存储用户在我的网站上发布的所有论坛消息。消息层次结构是使用嵌套集模型实现的。
以下是该表的简化结构:
- ID(主键)
- Owner_Id(对ID的外国主要参考)
- Parent_Id(对ID的外国主要参考)
- 左
- 好吧
- 级别
现在,表格看起来像这样:
+ ------- + ------------- + -------------- + ---------- + ----------- + ----------- +
| Id      | Owner_Id      | Parent_Id      | nleft      | nright      | nlevel      |
+ ------- + ------------- + -------------- + ---------- + ----------- + ----------- +
| 1       | 1             | NULL           | 1          | 8           | 1           |
| 2       | 1             | 1              | 2          | 5           | 2           |
| 3       | 1             | 2              | 3          | 4           | 3           |
| 4       | 1             | 1              | 6          | 7           | 2           |
+ ------- + ------------- + -------------- + ---------- + ----------- + ----------- +请注意,第一行是根消息,该帖子的树可以显示为:
-- SELECT * FROM forumTbl WHERE Owner_Id = 1 ORDER BY nleft;
MESSAGE (Id = 1)
    MESSAGE (Id = 2)
        Message (Id = 3)
    Message (Id = 4)当我尝试Owner_Id在单个查询中删除同一行下的所有行时,会发生我的问题。例:
DELETE FROM forumTbl WHERE Owner_Id = 1 ORDER BY nright;上面的查询失败,并出现以下错误:
错误代码:1451。无法删除或更新父行:外键约束失败(
forumTbl,CONSTRAINTOwner_Id_frgnFOREIGN KEY(Owner_Id)参考forumTbl(Id)上的DELETE NO ACTION ON UPDATE NO ACTION)
其原因是,在第一行,也就是根节点(Id=1),也具有同样的价值在其Owner_Id领域(Owner_Id=1),它导致查询失败是由于外键约束。
我的问题是:如何防止这种外键约束的圆度并删除引用其自身的行?有没有一种方法无需先将Owner_Id根行的更新为NULL?
我创建了这种情况的演示:http : //sqlfiddle.com/#!9/fd1b1
谢谢。