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

Fin*_*inn 11 postgresql indexing database-design unique-index unique-constraint

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

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

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

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

Erw*_*ter 19

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

安全的假设值唯一的,如果你有定义的唯一指标.这就是如何实现独特约束(目前,也可能在所有未来版本中).

定义UNIQUE约束实际上与创建唯一索引(无需指定索引类型)有效相同(几乎见下文).而且,我引用手册:

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

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

不,唯一约束只能在所有版本中使用基本btree索引实现,包括PostgreSQL 9.4.我在这里引用手册中的"ADD table_constraint_using_index"段落:

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

其他差异

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

  • 一个外键不能引用列与刚刚唯一索引.每个文件:

    外键必须引用作为主键或形成唯一约束的列.

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