我有一个表,用于存储用户在我的网站上发布的所有论坛消息。消息层次结构是使用嵌套集模型实现的。
以下是该表的简化结构:
- 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_frgn
FOREIGN 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
谢谢。