我有一张桌子:
CREATE TABLE MENUPOINT (
id BIGINT NOT NULL,
parent BIGINT,
name VARCHAR(64),
CONSTRAINT "MENUPOINT_pkey" PRIMARY KEY(id),
CONSTRAINT fkc75dac36251dd346 FOREIGN KEY (parent)
REFERENCES MENUPOINT(id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
NOT DEFERRABLE
);
这个内容:
id parent name
------------------------
1 null root
2 1 child
这一切都是为了创造这种结构:
root
+- child
现在我需要在数据库上检查一下检查这是否无法执行:
UPDATE MENUPOINT SET parent = 2 WHERE id = 1;
因为:
root
+- child
+- root
+- child
+- root ....
我有什么:
CONSTRAINT "NOT_SELF_REFERENCE" CHECK (id <> parent)
但它没有检查整棵树。
非循环树需要更改什么?
答案 0 :(得分:2)
评论太长了。
如果您要存储分层数据,那么此帖子是start的绝佳位置。您还可以使用Google&#34; Karwin等级树&#34;,因为Bill Karwin对此主题进行了彻底的调查。
对于你想做的事情,我会立即想到三件事。第一种是编写一个函数来检查周期,并将其用于insert
和update
触发器。这不是我最喜欢的选择。
另一种选择是使用闭包表。这将列出树中两个节点之间的所有链接。然后可以使用修改后的check
约束(如果所有新路径都有效,则基本上允许新连接,并且可以相当容易地检查它。)
也许最简单的(从使用角度来看)是完整的路径。如果每个节点都包含来自根的完整路径,那么在插入时,您可以非常轻松地检查现有的完整路径以进行潜在的循环。