Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres对两列的唯一约束:整数和布尔值_Postgresql_Constraints_Unique - Fatal编程技术网

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只是一个唯一且非空约束的总和。我认为使用您的解决方案,他不能有多个非活动地址。