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

use*_*882 3 sql postgresql unique

我进去了PostgreSQL 9.4。我有下表:

   id           name                 deleted
seril PK      varchar(32)        boolean NOT NULL
Run Code Online (Sandbox Code Playgroud)

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

use*_*r_0 5

您可以使用部分索引来实现。

从文档

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

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

只是添加一个示例:

CREATE UNIQUE INDEX yourindexname onyourtable (seril)
WHERE deleted = false;
Run Code Online (Sandbox Code Playgroud)

从PostgreSQL 7.2版本开始支持。

  • 7.2版,2002年2月。 (2认同)