13

在阅读了关于索引唯一性的文档作为实现细节之后,我一直试图理清 Postgres 中唯一性和索引之间的关系:

向表添加唯一约束的首选方法是 ALTER TABLE ... ADD CONSTRAINT。使用索引来强制执行唯一约束可以被认为是不应该直接访问的实现细节。然而,应该注意的是,没有必要在唯一列上手动创建索引。这样做只会复制自动创建的索引。

因此,按照他们的说法,我将仅将文档声明为唯一并使用隐式索引 - 或 - 创建索引而不假设值是唯一的。这是一个错误吗? 

我将从独特的索引中获得什么样的索引?鉴于只有 btree 将接受唯一约束并且 unique 隐式创建索引,UNIQUE 创建 btree 索引是真的吗?我不想无意中在哈希索引上运行范围。 

4

1 回答 1

21

创建索引并且不假定值是唯一的

如果您定义了唯一索引,则可以安全地假设值是唯一的。这就是唯一约束的实现方式(目前,并且可能在所有未来版本中也是如此)。

定义UNIQUE约束的效果与在不指定索引类型的情况下创建唯一索引的效果相同(几乎见下文)。而且,我引用手册

选项有 btree、hash、gist 和 gin。默认方法是 btree。

添加约束只是规范的方式,不会在将来的版本中破坏,因为它可以以不同的方式实现。就这样。

不,唯一约束只能在所有版本(包括 PostgreSQL v14)中使用基本btree索引来实现。引用手册中的“ADD table_constraint_using_index” 段落:

索引不能有表达式列,也不能是部分索引。此外,它必须是具有默认排序顺序的 b 树索引。

其他区别?

  • 唯一的约束可以被推迟。这对于唯一索引是不可能的。查看SET CONSTRAINTS命令并点击链接了解更多信息。

有关的:

于 2012-01-30T16:22:39.710 回答