PostgreSQL唯一约束-两列只有一行

tpgth1q7  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(120)

我有一个PostgreSQL表

CREATE TABLE metadado_log_audit (
    source_table varchar NULL,
    name_column varchar NULL,
    is_id_relation bool NULL
);

如何设置只有一行具有is_id_relation = true和unique source_table的约束
例如,我不能保存source_table ='user'和is_id_realation = true两次Tks

zd287kbt

zd287kbt1#

您似乎需要一个约束来强制source_table的唯一性,其中is_id_relation为true。
在Postgres中,你可以使用一个唯一的过滤索引:

create unique index metadado_log_audit_idx 
    on metadado_log_audit(source_table) 
    where is_id_relation;

Demo on fiddle

insert into metadado_log_audit (source_table, is_id_relation) values ('user', true);
-- ok
 
insert into metadado_log_audit (source_table, is_id_relation) values ('user', false);
-- ok

insert into metadado_log_audit (source_table, is_id_relation) values ('user', true);
-- ERROR:  duplicate key value violates unique constraint "metadado_log_audit_idx"
-- DETAIL:  Key (source_table)=(user) already exists.

请注意,Postgres唯一索引确实允许重复的null值。在Postgres 15中,您可以使用选项nulls not distinct更改此行为:

create unique index metadado_log_audit_idx 
    on metadado_log_audit(source_table) 
    nulls not distinct
    where is_id_relation;

相关问题