0

在 Postgres 上,会自动为主键列创建唯一索引。从文档中,

当索引声明为唯一时,不允许具有相同索引值的多个表行。空值不被视为相等。多列唯一索引只会拒绝所有索引列在多行中相等的情况。

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

4

2 回答 2

2

理论上,可以在不存在索引的情况下强制执行唯一键或主键约束,但这将是一个痛苦的过程。该索引主要用于性能目的。

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

另外,我不确定内部如何在 PostgreSQL btree 索引上工作,但所有 Oracle btree 在内部都被声明为唯一的:

  1. 在键列上,对于旨在为唯一的索引,或
  2. 在键列上加上索引行的 ROWID,用于非唯一索引。
于 2013-09-10T08:34:29.273 回答
1

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

于 2013-09-10T05:06:04.373 回答