使用UNIQUE约束和CHECK约束结合实现。
下面是一个示例表,其中group_id
和order_in_group
两列组成了一个复合主键。
CREATE TABLE my_table (
id SERIAL PRIMARY KEY,
group_id INT NOT NULL,
order_in_group INT NOT NULL,
value TEXT,
UNIQUE (group_id, order_in_group),
CHECK (
id = (
SELECT MIN(id)
FROM my_table t2
WHERE t2.group_id = my_table.group_id AND t2.order_in_group = my_table.order_in_group
)
)
);
在上面的示例中,使用了UNIQUE约束来保证group_id
和order_in_group
出现的组合不会重复。同时,使用了CHECK约束来限制重复值只能是出现在每个组的第一个位置,即id
最小的那个。
这样,在插入或更新数据时,如果有重复的group_id
和order_in_group
组合出现,就会引发UNIQUE约束的错误;如果有重复值出现在非第一个位置,就会引发CHECK约束的错误。