【发布时间】:2013-09-13 16:41:33
【问题描述】:
在 Postgres 上,会自动为主键列创建唯一索引。来自docs,
当一个索引被声明为唯一时,多个表行相等 不允许使用索引值。空值不被视为相等。 多列唯一索引只会拒绝所有索引的情况 列在多行中是相等的。
据我了解,该索引似乎只检查唯一性,实际上并不存在,以便在通过主键 id 查询时更快地访问。这是否意味着此索引结构不包含主键列的排序表(或树)?这是正确的吗?
【问题讨论】:
标签: postgresql
在 Postgres 上,会自动为主键列创建唯一索引。来自docs,
当一个索引被声明为唯一时,多个表行相等 不允许使用索引值。空值不被视为相等。 多列唯一索引只会拒绝所有索引的情况 列在多行中是相等的。
据我了解,该索引似乎只检查唯一性,实际上并不存在,以便在通过主键 id 查询时更快地访问。这是否意味着此索引结构不包含主键列的排序表(或树)?这是正确的吗?
【问题讨论】:
标签: postgresql
理论上,可以在不存在索引的情况下强制执行唯一键或主键约束,但这将是一个痛苦的过程。该索引主要用于性能目的。
但是,一些数据库(例如 Oracle)允许非唯一索引支持唯一或主键约束。这主要允许约束的执行推迟到事务结束,因此可以在事务期间暂时允许缺乏唯一性,但也允许并行构建索引,然后将约束定义为次要步骤。
另外,我不确定内部如何在 PostgreSQL btree 索引上工作,但所有 Oracle btree 都在内部声明为唯一的:
【讨论】:
恰恰相反,创建索引是为了允许更快的访问 - 主要是在插入新记录时检查重复项,但也可以由其他查询对 PK 列使用。 uk 索引的最佳结构是 btree,因为在插入期间会创建索引 - 如果 rdbms 检测到叶中的冲突,他将引发唯一约束冲突。
【讨论】: