对一组行的约束

问题描述

举个简单的例子,假设我有一个 list 表和一个 list_entry 表:

CREATE TABLE list 
(
    id SERIAL PRIMARY KEY,);

CREATE TABLE list_entry 
(
    id SERIAL PRIMARY KEY,list_id INTEGER NOT NULL
        REFERENCES list(id)
        ON DELETE CASCADE,position INTEGER NOT NULL,value TEXT NOT NULL,CONSTRAINT list_entry__position_in_list_unique
        UNIQUE(list_id,position)
);

我现在想添加以下约束:具有相同 list_id 的所有列表条目都有 position 条目,它们形成从 1 开始的连续序列。

我不知道怎么做。

我首先想到了 EXCLUDE 约束,但这似乎无济于事。

当然可以创建触发器,但如果可能的话,我宁愿不这样做。

解决方法

你不能用约束来做到这一点 - 你需要在代码中实现逻辑(例如使用触发器、存储过程、应用程序代码等)

,

我不知道这种使用约束的方式。通常,trigger 将是最直接的选择,但如果您想避免使用它们,请尝试使用 position 获取 list_entry 的当前 list_id 编号即将插入,例如插入一个 list_entrylist_id = 1:

INSERT INTO list_entry (list_id,position,value) VALUES 
(1,(SELECT coalesce(max(position),0)+1 FROM list_entry WHERE list_id = 1),42);

演示:db<>fiddle