自定义唯一列约束,仅当一列具有特定值时才实施


19

是否可能具有如下的自定义唯一列约束?假设我有两个cols subsettype两个字符串(尽管数据类型可能无关紧要)。

如果type是“真”,那么我希望的组合type,并subset是唯一的。否则,没有约束。我在Debian上使用PostgreSQL 8.4。


Answers:


31

换句话说,如果您想subset唯一type = 'true'
一个部分唯一索引会做到这一点:

CREATE UNIQUE INDEX tbl_some_name_idx ON tbl (subset) WHERE type = 'true';

这样,您甚至可以与NULL唯一组合,否则就无法实现-如以下相关答案所述:
PostgreSQL多列唯一约束和NULL值


谢谢欧文。查看文档时,我没有看到此选项。更直接的链接是postgresql.org/docs/current/interactive/indexes-partial.html。参见示例11-3。
Faheem Mitha 2013年

@FaheemMitha:由于您需要部分索引唯一索引结合使用,因此我将链接级别上移了一个。
Erwin Brandstetter 2013年

1
@Erwin该页面(关于部分索引)有一个带有部分唯一索引的示例。
ypercubeᵀᴹ

@ypercube:嗯,对。那是更好的链接。我更改了答案以指向最后一章。
Erwin Brandstetter

6

这是对以上Erwin的回答的补充,但是PostgreSQL支持许多类型的索引。这些通常不是相互排斥的。您可以将它们视为:

  • 索引方法(btree,GiST,GIN等)。如有必要,选择一个(默认为btree)
  • 部分或全部。如果部分使用where子句
  • 直接或功能。您可以索引函数的输出。
  • 唯一或不唯一

这些都可以以各种方式组合。您在这里所做的所有工作都是使用唯一和部分功能,因此可以为您提供部分唯一索引(在您发现时非常有用。

但是,假设您希望在类型为true的子集字段上具有不区分大小写的索引。然后,您将添加一个功能定义:

CREATE INDEX my_index_name_idx_u ON tbl (lower(subset)) WHERE type;

请注意,这会在类型为true的subset属性上调用的lower()函数的输出上创建唯一索引。


因此,欧文答案中的索引是直接的,而您的示例中的函数索引是正确的吗?
Faheem Mitha

@FaheemMitha:正确。
Erwin Brandstetter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.