PostgreSQL如何实施唯一约束/它使用什么类型的索引?
在阅读了以下内容后,我一直在尝试整理Postgres中unique和index之间的关系: 向表添加唯一约束的首选方法是ALTERTABLE。。。添加约束。使用索引强制实现唯一性 可以将约束视为一个实现细节,应该 不能直接访问。然而,人们应该意识到 无需在唯一列上手动创建索引;这样做会 只需复制自动创建的索引 因此,按照文档的意思,我将只声明事物是唯一的,并使用隐式索引,或者创建一个索引,而不是假设值是唯一的。这是个错误吗PostgreSQL如何实施唯一约束/它使用什么类型的索引?,postgresql,database-design,indexing,unique-constraint,unique-index,Postgresql,Database Design,Indexing,Unique Constraint,Unique Index,在阅读了以下内容后,我一直在尝试整理Postgres中unique和index之间的关系: 向表添加唯一约束的首选方法是ALTERTABLE。。。添加约束。使用索引强制实现唯一性 可以将约束视为一个实现细节,应该 不能直接访问。然而,人们应该意识到 无需在唯一列上手动创建索引;这样做会 只需复制自动创建的索引 因此,按照文档的意思,我将只声明事物是唯一的,并使用隐式索引,或者创建一个索引,而不是假设值是唯一的。这是个错误吗 我将从unique获得什么样的索引?鉴于只有btree才会接受uniqu
我将从unique获得什么样的索引?鉴于只有btree才会接受unique约束,并且unique会隐式创建索引,unique是否会创建btree索引?我不想无意中在散列索引上运行范围 或-创建一个索引,不要假设值是唯一的 如果定义了唯一索引,则可以安全地假定值是唯一的。这就是独特约束的实现方式(目前,可能在未来的所有版本中也是如此) 定义
唯一
约束实际上与创建唯一索引(而不指定索引类型)相同。我:
选择有btree、hash、gist和gin。默认方法是btree
添加约束只是一种规范化的方式,在将来的版本中,它的实现方式可能会有所不同。就这些
不,只有在PostgreSQL 9.4之前的所有版本(包括PostgreSQL 9.4)中使用基本的btree索引才能实现唯一约束。我引用手册中的“使用索引添加表约束”一段:
索引不能有表达式列,也不能是部分索引。也,
它必须是具有默认排序顺序的b树索引
其他差异
- 唯一约束可以被推迟。这对于唯一索引是不可能的。查看该命令并按照链接了解更多信息
唯一的使用哈希或rtree索引来强制执行吗?@Finn:我在我的答案中添加了另一位来解决这个问题。在v9.4.11中,我可以添加一个外键,该外键只引用一个唯一索引的列,不是一个唯一的约束。NVM,今天我知道PostgreSQL有Shash哈希支持:“我不想在哈希索引中无意中运行范围。”但是再一次:考虑一个实现细节。存在用于强制/确保数据模型的约束,它们不关心性能本身。这是逻辑/语义上的差异。(顺便说一句:它是一个btree)有趣的是,从v9.5开始,PostgreSQL文档中引用的首选项已经消失了。看见