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