唯一约束与唯一索引?

avi*_*avi 2 sql postgresql

是否有区别:

CREATE TABLE p(
    product_no integer,
    name text UNIQUE,
    price numeric
);
Run Code Online (Sandbox Code Playgroud)

和:

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

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

编辑Postgres 唯一约束与索引没有回答我的问题。它考虑了 FK 的情况。我的问题与 FK 无关。我只想知道这两个操作在这个不涉及 FK 的例子中是否等效。

Cra*_*ger 5

是的,有一点区别。如果你定义了一个唯一的约束,它在目录中是可见的,比如information_schema. 这不适用于唯一索引。

此外,您可以创建诸如部分唯一索引之类的内容,但不能在约束上执行此操作。

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

唯一约束意味着创建唯一索引,但反之则不然。

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

  • 我发现在唯一约束上使用唯一索引的唯一原因是能够利用“IF NOT EXISTS”。我认为这不是一个很好的论据,只是分享我的快速开发工作流程的经验。 (2认同)