Postgres - 主键上的唯一索引

时间:2013-09-10 04:58:06

标签: postgresql

在Postgres上,会自动为主键列创建唯一索引。来自docs

  

当索引声明为唯一时,多个表行等于   不允许使用索引值。空值不被认为是平等的。   多列唯一索引仅拒绝所有索引的情况   列在多行中相等。

根据我的理解,似乎此索引仅检查唯一性,并且在通过主键ID查询时实际上不存在以便更快地访问。这是否意味着此索引结构不包含主键列的排序表(或树)?这是对的吗?

2 个答案:

答案 0 :(得分:2)

理论上,可以在没有索引的情况下强制执行唯一或主键约束,但这将是一个痛苦的过程。该指数主要用于表现目的。

但是,某些数据库(例如Oracle)允许非唯一索引支持唯一或主键约束。主要是这允许将约束的强制执行推迟到事务结束,因此在事务期间可以临时允许缺乏唯一性,但是也允许并行构建索引,然后将约束定义为次要步骤。

另外,我不确定内部如何处理PostgreSQL btree索引,但所有Oracle btree都在内部声明为唯一:

  1. 在键列上,用于索引为UNIQUE或
  2. 对于非唯一索引,
  3. 在键列上加上索引行的ROWID。

答案 1 :(得分:1)

恰恰相反,创建索引是为了允许更快的访问 - 主要是在插入新记录时检查重复项,但也可以由针对PK列的其他查询使用。英国索引的最佳结构是btree,因为在插入过程中会创建索引 - 如果rdbms在叶子中检测到冲突,则会引发唯一的约束违规。