PostgreSQL:我应该改变现有索引还是创建一个新索引?

时间:2013-07-24 14:30:44

标签: postgresql

我有一个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值应该都是唯一的。

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

3 个答案:

答案 0 :(得分: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);

psql中来自\d的UNIQUE索引(我名为mine _uidx)和UNIQUE CONSTRAINT(_uc)的输出如下所示:

\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)

答案 1 :(得分: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 manual表示这是错误的做法:

  

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

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

答案 2 :(得分:0)

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