自定义唯一约束,仅当一列具有特定值时强制执行

Fah*_*tha 25 postgresql index database-design constraint unique-constraint

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

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

Erw*_*ter 37

换句话说,您希望列中的值在subset列为type“真”的行中是唯一的。
一个部分唯一索引会做到这一点:

CREATE UNIQUE INDEX tbl_some_name_idx ON tbl (subset) WHERE type = 'true';
Run Code Online (Sandbox Code Playgroud)

数据类型的事情。如果该列typeboolean(可能应该是),则可以简化:

CREATE UNIQUE INDEX tbl_some_name_idx ON tbl (subset) WHERE type;
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您甚至可以与NULLunique进行组合,否则这是不可能的。看:


Chr*_*ers 7

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

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

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

但是假设您希望在 type 为 true 的子集字段上有一个不区分大小写的索引。然后你会添加一个函数定义:

CREATE INDEX my_index_name_idx_u ON tbl (lower(subset)) WHERE type;
Run Code Online (Sandbox Code Playgroud)

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