2

我有一个 billing_infos 表,其中有一列名为order_id. 它已经有一个索引。

\d billing_infos
...
Indexes:
    "billing_infos_pkey" PRIMARY KEY, btree (id)
    "billing_infos_address_id_idx" btree (address_id)
    "index_billing_infos_on_order_id" btree (order_id) //<--this one

但是,我不确定这是否是唯一索引。我的任务是创建一个唯一索引,但我不确定是否应该更改已经存在的索引或创建一个新索引。order_id 值都应该是唯一的。

我应该创建一个新索引还是更改现有索引?
以及如何检查现有索引是否唯一?

4

3 回答 3

3

同时创建唯一索引可能是侵入性最小的。请注意,使用 CONSTRAINT 是强制唯一性的推荐方法。如果要检查的列需要函数来创建唯一性,则 UNIQUE 索引更有用。后者的一个示例是使用 COALESCE() 来防止 NULL 绕过 UNIQUE 检查。例如。

create unique index foo_col1_col2_uidx on foo (col1, coalesce(col2,-1));

在上面的示例中,col2 是一个整数列,并且未定义为 NOT NULL。

同时创建唯一索引的示例。

create unique index concurrently billing_infos_order_id_uidx on billing_infos (order_id);

psqlUNIQUE 索引(我命名为我的 _uidx)和 UNIQUE CONSTRAINT (_uc) 的输出\d如下所示:

\d foo
                Table "public.foo"
 Column |            Type             | Modifiers 
--------+-----------------------------+-----------
 x      | integer                     | 
 tstamp | timestamp without time zone | 
 col    | text                        | 
Indexes:
    "foo_col_uidx" UNIQUE, btree (col)                <<< unique index
    "foo_tstamp_uc" UNIQUE CONSTRAINT, btree (tstamp) <<< unique constraint
    "foo_idx" btree (x)
于 2013-07-24T14:56:44.813 回答
1

这不是唯一索引。

尝试创建一个简单的表,它有一个主键、一个具有唯一约束的列和一个具有普通索引的列:

create table example (id integer primary key, alpha integer, beta integer, gamma integer);
alter table example add constraint alpha_unique unique (alpha);
create index beta_normal on example (beta);
create unique index gamma_unique on example (gamma);

如果你使用\d它,输出是:

    Table "public.example"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | not null
 alpha  | integer | 
 beta   | integer | 
 gamma  | integer | 
Indexes:
    "example_pkey" PRIMARY KEY, btree (id)
    "alpha_unique" UNIQUE CONSTRAINT, btree (alpha)
    "gamma_unique" UNIQUE, btree (gamma)
    "beta_normal" btree (beta)

如您所见,当索引是唯一的时,它会这样说。您甚至可以看到索引何时实现唯一约束。

那你该怎么办?首先,不要添加唯一索引。永远不要那样做。如果要对列施加唯一性约束,可以通过添加唯一性约束来实现。约束,而不是索引。线索就在名字里。

添加唯一索引可能很有效,但正如PostgreSQL 手册所说,这样做是错误的:

向表添加唯一约束的首选方法是 ALTER TABLE ... ADD CONSTRAINT。使用索引来强制执行唯一约束可以被认为是不应该直接访问的实现细节。

因此,只需使用alter table ... add constraint我上面使用的语法来添加约束。

于 2013-07-24T14:51:38.700 回答
0

使用 PgAdmin 工具查看索引结构。

于 2013-07-24T14:52:53.407 回答