PG Checker用于父子验证

时间:2017-01-30 11:47:14

标签: sql postgresql hierarchical-data recursive-query

我有一张桌子:

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;

因为:

  1. 我无法找出谁是谁。
  2. 树的显示将是无穷无尽的:

  3.  root 
      +- child
          +- root
              +- child
                  +- root ....
    

    我有什么:

    CONSTRAINT "NOT_SELF_REFERENCE" CHECK (id <> parent)
    

    但它没有检查整棵树。

    非循环树需要更改什么?

1 个答案:

答案 0 :(得分:2)

评论太长了。

如果您要存储分层数据,那么此帖子是start的绝佳位置。您还可以使用Google&#34; Karwin等级树&#34;,因为Bill Karwin对此主题进行了彻底的调查。

对于你想做的事情,我会立即想到三件事。第一种是编写一个函数来检查周期,并将其用于insertupdate触发器。这不是我最喜欢的选择。

另一种选择是使用闭包表。这将列出树中两个节点之间的所有链接。然后可以使用修改后的check约束(如果所有新路径都有效,则基本上允许新连接,并且可以相当容易地检查它。)

也许最简单的(从使用角度来看)是完整的路径。如果每个节点都包含来自根的完整路径,那么在插入时,您可以非常轻松地检查现有的完整路径以进行潜在的循环。