【问题标题】:Postgres - unique index on primary keyPostgres - 主键上的唯一索引
【发布时间】:2013-09-13 16:41:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: postgresql


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-03
        • 2017-04-28
        • 2014-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多