Jako klucz podstawowy
Zrób to, jeśli ten unikalny jest kluczem podstawowym:
create table tbl(
a_id int not null,
b_id int not null,
constraint tbl_pkey primary key(a_id,b_id)
);
Nie klucz podstawowy
Zrób to, jeśli ten unikatowy klucz nie jest kluczem podstawowym:
create table tbl(
-- other primary key here, e.g.:
-- id serial primary key,
a_id int not null,
b_id int not null,
constraint tbl_unique unique(a_id,b_id)
);
Istniejąca tabela
Jeśli masz już tabelę, zrób to:
alter table tbl
add constraint tbl_unique unique(a_id, b_id)
Ta alternatywna tabela wyświetla następujący komunikat:
NOTICE: ALTER TABLE / ADD UNIQUE will create implicit index "tbl_unique" for table "tbl"
Query returned successfully with no result in 22 ms.
Upuść
Jeśli chcesz usunąć to ograniczenie (możesz chcieć stworzyć unikalną kombinację 3 pól):
ALTER TABLE tbl DROP CONSTRAINT tbl_unique;
Indeks i ograniczenia i wartości zerowe
Odnośnie indeksu, z dokumentu Postgres:
Źródło:http://www.postgresql.org/docs/9.1 /static/indexes-unique.html
Jeśli unikatowość zależy od pewnych reguł, użyj CREATE UNIQUE INDEX
, na przykład:
Biorąc pod uwagę to:
CREATE TABLE tbl
(
a_id integer NOT NULL,
b_id integer NULL
);
alter table tbl
add constraint tbl_unique unique(a_id, b_id);
Ten unikalny może wychwycić te duplikaty, zostanie to odrzucone przez bazę danych:
insert into tbl values
(1,1),
(1,1);
Jednak to UNIQUE CONSTRAINT nie może wyłapać zduplikowanych wartości null. Nulls są nieznane, służą jako symbol wieloznaczny, dlatego dozwolone jest posiadanie wielu wartości null w unikalnym ograniczeniu. Zostanie to zaakceptowane przez bazę danych:
insert into tbl values
(1,1),
(1,null), -- think of this null as wildcard, some real value can be assigned later.
(1,null); -- and so is this. that's why both of these nulls are allowed
Pomyśl o UNIQUE CONSTRAINT
że pozwala na odroczoną unikatowość, stąd akceptacja wartości null powyżej.
Jeśli chcesz mieć tylko jeden symbol wieloznaczny (null b_id) na a_id, oprócz ograniczenia unikalności, musisz dodać UNIQUE INDEX
. UNIQUE CONSTRAINT nie może mieć na nich wyrazu. INDEX
i UNIQUE INDEX
Móc. To będzie Twój kompletny plik DDL do odrzucania wielu wartości null;
To będzie Twój kompletny DDL:
CREATE TABLE tbl
(
a_id integer NOT NULL,
b_id integer NULL
);
alter table tbl
add constraint tbl_unique unique(a_id, b_id);
create unique index tbl_unique_a_id on tbl(a_id) where b_id is null;
To zostanie teraz odrzucone przez Twoją bazę danych:
insert into tbl values
(1,1),
(1,null),
(1,null);
Będzie to dozwolone:
insert into tbl values
(1,1),
(1,null);
Powiązane z http://www.ienablemuch .com/2010/12/postgresql-said-sql-server2008-said-non.html