我有一个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值应该都是唯一的。
我应该创建新索引还是更改现有索引? 我如何检查现有索引是否唯一?
答案 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工具查看索引结构。