在阅读docs on index uniqueness being an implementation detail之后,我一直在努力理清Postgres中唯一与索引之间的关系:
向表中添加唯一约束的首选方法是ALTER TABLE ... ADD CONSTRAINT。使用索引来强制执行唯一的 约束可以被视为应该的实现细节 不能直接访问。但是,应该知道有 无需在唯一列上手动创建索引;这样做会 只需复制自动创建的索引。
因此,按照他们的说法,我只是将事物声明为唯一并使用隐式索引 - 或 - 创建索引而不是假设值是唯一的。这是一个错误吗?
我将从独特中获得什么样的索引?假设只有一个btree会接受唯一约束而且unique会隐式创建一个索引,那么UNIQUE是否真的创建了一个btree索引?我不想无意中在哈希索引上运行范围。
答案 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的后续答案中的更多细节: