唯一约束 vs 唯一索引?

4

这两个表达有何不同:

CREATE TABLE p(
    product_no integer,
    name text UNIQUE,
    price numeric
);

并且:

CREATE TABLE p(
        product_no integer,
        name text,
        price numeric
 );
CREATE UNIQUE INDEX customername
  ON p
  USING btree
  (name COLLATE pg_catalog."default");

在这两种情况下,名称是否唯一?当索引是唯一的时,它意味着什么?

编辑Postgres unique constraint vs index并没有回答我的问题。它考虑了一个带有FK的情况。我的问题与FK无关。我只想知道在没有涉及FK的这个例子中这两个操作是否等价。


它们在功能上是相同的。唯一约束创建唯一索引。(我在思考是否存在不使用默认排序规则的情况,但我认为没有。) - Gordon Linoff
2
可能是Postgres唯一约束与索引的重复问题。 - klin
@klin,那并没有回答我的问题。 - avi
1
@avi 它全面而详尽地回答了你的两个问题。我不知道你指的是哪一个问题? - klin
klin,Craig 给出的答案是 - 没有区别。请告诉我你是如何从"重复"的问题中得出这个结论的。 - avi
显示剩余2条评论
2个回答

13

是的,两者有一点不同。如果您定义了唯一约束 constraint,它将在类似于 information_schema 的目录中可见。唯一索引则不然。

此外,您可以创建诸如部分唯一索引这样的内容,但无法在约束上执行。

最后,唯一约束是符合 SQL 标准的。

唯一约束 implies 唯一索引的创建,但反之则不成立。

除非您有充分理由直接创建唯一索引,否则请使用唯一约束。


2
我发现使用唯一索引而不是唯一约束的唯一原因是能够利用IF NOT EXISTS。我知道这不是一个很好的论点,但只是分享我的经验,以便快速开发工作流程。 - Olshansky

4

文档中得知:

添加唯一约束将自动在用于约束的列或列组上创建唯一的btree索引。

所以对于您的简化示例,它们是等价的。


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