Postgresql Postgres对两列的唯一约束:整数和布尔值
我想找到一种方法在我的数据库中存储一个主题的多个地址,每个主题只有一个默认地址 长话短说,假设我们有一张桌子:Postgresql Postgres对两列的唯一约束:整数和布尔值,postgresql,constraints,unique,Postgresql,Constraints,Unique,我想找到一种方法在我的数据库中存储一个主题的多个地址,每个主题只有一个默认地址 长话短说,假设我们有一张桌子: CREATE TABLE test ( id integer NOT NULL, active boolean NOT NULL, CONSTRAINT pk_id PRIMARY KEY (id) ) 对于表中的每个id,最多必须有一个真正的活动值 我怎样才能做到这一点 谢谢。正是您想要的: create unique index some_index on test
CREATE TABLE test
(
id integer NOT NULL,
active boolean NOT NULL,
CONSTRAINT pk_id PRIMARY KEY (id)
)
对于表中的每个id,最多必须有一个真正的活动值
我怎样才能做到这一点
谢谢。正是您想要的:
create unique index some_index on test (id) where active;
正如@ThiefMaster所述,应该删除主索引。在这个问题中,如前所述,它不需要 但仅供参考,您可以将约束设置为2个或更多(非PrimaryKey)具有不同类型的列。例如:
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (integer_column, boolean_column);
有关更多信息,请参阅Postgres文档的“唯一约束”部分。引述:
如果唯一约束引用一组列,则列将以逗号分隔
这指定指示列中的值的组合在整个表中是唯一的,尽管其中任何一列都不必(通常也不必)是唯一的
注意:
设置在表的子集上构建的索引,这有一个完全不同的目的。实际上你不需要做任何事情,因为
id
作为主键使它唯一,因此不能有两行具有相同的id。如果你不想id
作为主键,那么你需要编写一个触发器:但这可能不是你想要的。谢谢。这很好,因为我的PK是这个表中的地址PK。这同样有效:在测试中使用btree(active,id)在活动的地方创建唯一索引;您应该注意到,在查询中唯一真正更改的是向索引中添加活动。虽然活动始终适用于所有字段,但用于索引的主题只是添加了一些bloat。PK只是一个唯一且非空约束的总和。我认为使用您的解决方案,他不能有多个非活动地址。