是否可以为所有行的子集设置唯一约束?

时间:2015-06-08 13:44:16

标签: sql postgresql unique

我在PostgreSQL 9.4。我有下表:

   id           name                 deleted
seril PK      varchar(32)        boolean NOT NULL

是否可以将UNIQUE约束应用于deleted = false的所有行?

1 个答案:

答案 0 :(得分:4)

您可以使用部分索引来完成。

来自文档

  

当存在WHERE子句时,将创建部分索引。部分索引是一个索引,它只包含表的一部分的条目,通常是比索引的其余部分更有用的索引部分。例如,如果您的表包含已开票和未开单的订单,其中未开单的订单占据总表的一小部分,但这是一个经常使用的部分,您可以通过仅在该部分上创建索引来提高性能。另一个可能的应用是使用带有UNIQUE的WHERE来强制表的子集的唯一性。有关更多讨论,请参见第11.8节。

参考:http://www.postgresql.org/docs/9.4/static/sql-createindex.html

只是添加一个例子:

CREATE UNIQUE INDEX yourindexname onyourtable (seril)
WHERE deleted = false;

自Postgresql版本7.2起支持此功能。