这不是唯一索引。
尝试创建一个简单的表,它有一个主键、一个具有唯一约束的列和一个具有普通索引的列:
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
我上面使用的语法来添加约束。