0

举个简单的例子,假设我有一张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约束,但这似乎无济于事。

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

4

2 回答 2

1

我不知道这种使用约束的方式。通常 atrigger是最直接的选择,但如果您想避免使用它们,请尝试使用您要插入的 the 获取当前数字position,例如插入 a with = 1:list_entrylist_idlist_entrylist_id

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

于 2021-07-12T14:27:14.570 回答
1

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

于 2021-07-12T14:00:07.307 回答