【问题标题】:Should I specify both INDEX and UNIQUE INDEX?我应该同时指定 INDEX 和 UNIQUE INDEX 吗?
【发布时间】:2011-05-30 17:20:42
【问题描述】:

在我的一个 PostgreSQL 表中,我有一组两个字段,它们将被定义为在表中是唯一的,但在选择数据时也会一起使用。鉴于此,我只需要定义一个 UNIQUE INDEX,还是应该在 UNIQUE INDEX 之外指定一个 INDEX?

这个?

CREATE UNIQUE INDEX mytable_col1_col2_idx ON mytable (col1, col2);

还是这个?

CREATE UNIQUE INDEX mytable_col1_col2_uidx ON mytable (col1, col2);
CREATE INDEX mytable_col1_col2_idx ON mytable (col1, col2);

【问题讨论】:

    标签: postgresql indexing unique-constraint unique-index


    【解决方案1】:

    如果您有 UNIQUE INDEX,那么您就不需要 INDEX - 这将是多余的。 UNIQUE INDEX 既是唯一约束,又是可以像任何其他索引一样使用的索引。

    来自documentation

    注意:向表添加唯一约束的首选方法是 ALTER TABLE ... ADD CONSTRAINT。使用索引来强制唯一约束可以被认为是不应该直接访问的实现细节。然而,应该注意的是,没有必要在唯一列上手动创建索引。这样做只会复制自动创建的索引。

    强调我的。

    【讨论】:

    • 另请注意,每个字段上的唯一索引与两个字段上的唯一索引不同。如果您需要在每个单独的字段上单独使用唯一索引,则两个 col 索引将不会这样做。
    • OT,但这也解决了我的问题。我使用 Hibernate/jpa 注释遇到了这个问题。我不确定设置唯一列是否也添加了索引。至少在 Postgres 中是这样,因此无需为列添加单独的索引。
    • 我不确定这是不是真的。注释here 只是说不需要手动创建索引,而不是说不需要(非唯一)索引恕我直言。查看一些查询执行计划似乎可以确认只有在为该列添加另一个(非唯一)索引时才会使用索引进行查找。
    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 2023-03-16
    • 2015-09-02
    • 2015-03-14
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2012-07-06
    相关资源
    最近更新 更多