PostgreSQL如何强制执行UNIQUE约束/它使用什么类型的索引?

时间:2012-01-30 16:13:45

标签: postgresql database-design indexing unique-constraint unique-index

在阅读docs on index uniqueness being an implementation detail之后,我一直在努力理清Postgres中唯一与索引之间的关系:

  

向表中添加唯一约束的首选方法是ALTER TABLE ... ADD CONSTRAINT。使用索引来强制执行唯一的   约束可以被视为应该的实现细节   不能直接访问。但是,应该知道有   无需在唯一列上手动创建索引;这样做会   只需复制自动创建的索引。

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

我将从独特中获得什么样的索引?假设只有一个btree会接受唯一约束而且unique会隐式创建一个索引,那么UNIQUE是否真的创建了一个btree索引?我不想无意中在哈希索引上运行范围。

1 个答案:

答案 0 :(得分:19)

  

或 - 创建一个索引而不是假设这些值是唯一的

安全地假设值 唯一,如果您定义了唯一索引。这就是如何实现独特的约束(当前,也可能在所有未来的版本中)。

定义UNIQUE约束实际上相同(几乎,见下文)创建唯一索引而不指定索引类型。而且,我quote the manual

  

选择是btree,hash,gist和gin。默认方法是btree。

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

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

  

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

其他差异

  • 唯一约束可以延期。这对于唯一索引是不可能的。查看SET CONSTRAINTS命令并按照链接获取更多信息。

  • 外键无法引用 唯一索引的列。 Per documentation:

      

    外键必须引用主键或列   形成一种独特的约束。

关于dba.SE的后续答案中的更多细节: