PostgreSQL如何实施唯一约束/它使用什么类型的索引?

PostgreSQL如何实施唯一约束/它使用什么类型的索引?,postgresql,database-design,indexing,unique-constraint,unique-index,Postgresql,Database Design,Indexing,Unique Constraint,Unique Index,在阅读了以下内容后,我一直在尝试整理Postgres中unique和index之间的关系: 向表添加唯一约束的首选方法是ALTERTABLE。。。添加约束。使用索引强制实现唯一性 可以将约束视为一个实现细节,应该 不能直接访问。然而,人们应该意识到 无需在唯一列上手动创建索引;这样做会 只需复制自动创建的索引 因此,按照文档的意思,我将只声明事物是唯一的,并使用隐式索引,或者创建一个索引,而不是假设值是唯一的。这是个错误吗 我将从unique获得什么样的索引?鉴于只有btree才会接受uniqu

在阅读了以下内容后,我一直在尝试整理Postgres中unique和index之间的关系:

向表添加唯一约束的首选方法是ALTERTABLE。。。添加约束。使用索引强制实现唯一性 可以将约束视为一个实现细节,应该 不能直接访问。然而,人们应该意识到 无需在唯一列上手动创建索引;这样做会 只需复制自动创建的索引

因此,按照文档的意思,我将只声明事物是唯一的,并使用隐式索引,或者创建一个索引,而不是假设值是唯一的。这是个错误吗


我将从unique获得什么样的索引?鉴于只有btree才会接受unique约束,并且unique会隐式创建索引,unique是否会创建btree索引?我不想无意中在散列索引上运行范围

或-创建一个索引,不要假设值是唯一的

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

定义
唯一
约束实际上与创建唯一索引(而不指定索引类型)相同。我:

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

添加约束只是一种规范化的方式,在将来的版本中,它的实现方式可能会有所不同。就这些

不,只有在PostgreSQL 9.4之前的所有版本(包括PostgreSQL 9.4)中使用基本的btree索引才能实现唯一约束。我引用手册中的“使用索引添加表约束”一段:

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

其他差异
  • 唯一约束可以被推迟。这对于唯一索引是不可能的。查看该命令并按照链接了解更多信息
-外键不能引用只有唯一索引的列

外键必须引用主键或 形成唯一的约束。

最后一点似乎过时了,或者是来自getgo的误解。见:

相关的:


“树索引是默认的…”这是正确的,无论该索引是如何形成的(即索引与唯一的),因此可以强制
唯一的
使用哈希或rtree索引来强制执行吗?@Finn:我在我的答案中添加了另一位来解决这个问题。在v9.4.11中,我可以添加一个外键,该外键只引用一个唯一索引的列,不是一个唯一的约束。NVM,今天我知道PostgreSQL有Shash哈希支持:“我不想在哈希索引中无意中运行范围。”但是再一次:考虑一个实现细节。存在用于强制/确保数据模型的约束,它们不关心性能本身。这是逻辑/语义上的差异。(顺便说一句:它是一个btree)有趣的是,从v9.5开始,PostgreSQL文档中引用的首选项已经消失了。看见