Postgresql 基于其他行的行值约束

Mon*_*tes 3 sql postgresql check-constraints exclude-constraint

给出以下架构

CREATE TABLE test (
    value text,
    flag bool
);
Run Code Online (Sandbox Code Playgroud)

这是否可能,创建这样的约束,该约束将允许具有相同value和的重复行flag = true,但最多允许具有给定value和 的行flag = false

例如

这些应该执行没有错误

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);
Run Code Online (Sandbox Code Playgroud)
INSERT INTO test (value, flag) VALUES ('1', true);
INSERT INTO test (value, flag) VALUES ('1', true);
INSERT INTO test (value, flag) VALUES ('1', false);
Run Code Online (Sandbox Code Playgroud)
INSERT INTO test (value, flag) VALUES ('1', false);
INSERT INTO test (value, flag) VALUES ('1', true);
Run Code Online (Sandbox Code Playgroud)

这应该会引发错误

INSERT INTO test (value, flag) VALUES ('1', false);
INSERT INTO test (value, flag) VALUES ('1', false);
Run Code Online (Sandbox Code Playgroud)

我尝试过EXCLUDE限制性地玩游戏,但无法使其发挥作用。

mu *_*ort 6

您正在寻找唯一的部分索引:

create unique index no_false_duplicates on test (value, flag) where not flag
Run Code Online (Sandbox Code Playgroud)

当然,你必须弄清楚你想对null价值观做什么。flag我建议自始至终创建该flag专栏not nullnull布尔值很少是您想要的。

有关详细信息,请参阅创建索引文档。