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