postgresql 对一组行的约束

tyg4sfes  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(3)|浏览(164)

举个简单的例子,假设我有一个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)
);

我现在要添加以下约束:具有相同x1M2N1x的所有列表条目具有x1M3N1x条目,
我也不知道是怎么回事。
我首先想到的是EXCLUDE约束,但这似乎没有任何结果。
当然可以创造一个触发器,但我宁愿不,如果在所有可能的。

ctrmrzij

ctrmrzij1#

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

mzillmmw

mzillmmw2#

我不知道这种使用约束的方式。通常trigger是最直接的选择,但是如果你不想使用它们,试着用你将要插入的list_id得到list_entry的当前position数,例如插入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

bzzcjhmw

bzzcjhmw3#

你可以使用一个生成的列来引用列表中的前一个数字,本质上就是构建一个链表。

create table list_entry 
(
  pos integer not null primary key,
  val text not null,
  
  prev_pos integer not null
    references list_entry (pos)
    generated always as (greatest(0, pos-1)) stored
);

在此实现中,第一项(pos=0)指向其自身。

相关问题