Postgresql 约束基于其他行的行值

Postgresql Constraint on row value based on other rows

给定以下架构

CREATE TABLE test (
    value text,
    flag bool
);

是否有可能创建这样的约束,它允许具有相同 valueflag = true 的重复行,但最多允许具有给定 value 和 [ 的行一次=18=]

例如

这些应该没有错误地执行

INSERT INTO test (value, flag) VALUES ('1', true);
INSERT INTO test (value, flag) VALUES ('1', true);
INSERT INTO test (value, flag) VALUES ('1', true);
INSERT INTO test (value, flag) VALUES ('1', true);
INSERT INTO test (value, flag) VALUES ('1', true);
INSERT INTO test (value, flag) VALUES ('1', true);
INSERT INTO test (value, flag) VALUES ('1', false);
INSERT INTO test (value, flag) VALUES ('1', false);
INSERT INTO test (value, flag) VALUES ('1', true);

这应该会引发错误

INSERT INTO test (value, flag) VALUES ('1', false);
INSERT INTO test (value, flag) VALUES ('1', false);

我试过使用 EXCLUDE 约束,但没能成功。

您正在寻找唯一的 partial 索引:

create unique index no_false_duplicates on test (value, flag) where not flag

当然,您必须弄清楚要对 flag 中的 null 值做什么。我建议将 flag 列设为 not null,因为 null 布尔值很少是您想要的。

详情见CREATE INDEX documentation