我应该同时指定INDEX和UNIQUE INDEX吗?

30

在我的一个 PostgreSQL 表中,我有一组两个字段将被定义为在表中唯一,但在选择数据时也将同时使用这两个字段。那么,我只需要定义一个唯一索引吗?还是除了唯一索引,我还应该指定一个索引?

这个问题是什么意思?

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);
1个回答

52
如果您有一个唯一索引,则不需要额外创建索引-这是冗余的。唯一索引既是唯一约束条件,也是可以像其他索引一样使用的索引。
来自文档:
注意:向表添加唯一约束条件的首选方法是使用 ALTER TABLE ... ADD CONSTRAINT。使用索引来强制实施唯一约束条件可能被视为不应直接访问的实现细节。但是,应该注意到,没有必要手动在唯一列上创建索引;这样做只会复制自动创建的索引。
重点是我的。

10
请注意,每个字段单独的唯一索引与两个字段组合的唯一索引不同。如果您需要在每个字段上分别创建唯一索引,则使用两个列的索引将无法实现此目的。 - Scott Marlowe
OT,但这也解决了我的问题。 我在使用Hibernate / jpa注释时遇到了这个问题。 我不确定设置唯一列是否也添加了索引。 至少在Postgres中是这样的,因此不需要为列添加单独的索引。 - Mike Miller
1
我不确定这是否正确。这里的注释(https://www.postgresql.org/docs/9.4/sql-createindex.html#SQL-CREATEINDEX-CONCURRENTLY)仅表示索引无需手动创建,并不意味着(非唯一)索引没有必要,以我个人看来。查看一些查询执行计划似乎证实,仅当为该列添加了另一个(非唯一)索引时,索引才用于查找。 - jl.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接