递归外键的排除约束(以树为例)

Eld*_*rov 0 postgresql tree foreign-key constraint recursive

我有带有递归外键的表。它只是层次树结构:

CREATE TABLE tree (
    id              INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    value           INTEGER NOT NULL,
    tree_id         SMALLINT NOT NULL CHECK (tree_id > CAST(0 AS SMALLINT)),
    parent_id       INTEGER REFERENCES tree ON DELETE RESTRICT ON UPDATE RESTRICT,

    EXCLUDE (tree_id WITH =) WHERE (parent_id IS NULL) -- allow only one root within tree
);
Run Code Online (Sandbox Code Playgroud)

如何拒绝插入非空parent_id和不同的记录tree_id?即外键parent_id只能引用id同一个内的主键tree_id

ype*_*eᵀᴹ 5

使用复合外键:

(tree_id, parent_id) REFERENCES (tree_id, id)
Run Code Online (Sandbox Code Playgroud)

您将需要首先更改 PK 或添加UNIQUE约束(tree_id, id)