Postgresql 约束基于其他行的行值
Postgresql Constraint on row value based on other rows
给定以下架构
CREATE TABLE test (
value text,
flag bool
);
是否有可能创建这样的约束,它允许具有相同 value
和 flag = 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 TABLE test (
value text,
flag bool
);
是否有可能创建这样的约束,它允许具有相同 value
和 flag = 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
布尔值很少是您想要的。