Als primaire sleutel
Doe dit als die unieke primaire sleutel is:
create table tbl(
a_id int not null,
b_id int not null,
constraint tbl_pkey primary key(a_id,b_id)
);
Geen primaire sleutel
Doe dit als die unieke niet-primaire sleutel is:
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)
);
Bestaande tabel
Als u een bestaande tabel heeft, doet u dit in plaats daarvan:
alter table tbl
add constraint tbl_unique unique(a_id, b_id)
Die wijzigingstabel geeft dit bericht weer:
NOTICE: ALTER TABLE / ADD UNIQUE will create implicit index "tbl_unique" for table "tbl"
Query returned successfully with no result in 22 ms.
Laat vallen
Als je die beperking wilt laten vallen (je wilt misschien een combinatie van 3 velden uniek maken):
ALTER TABLE tbl DROP CONSTRAINT tbl_unique;
Index &beperking &nulwaarden
Betreffende index, van Postgres-document:
Bron:http://www.postgresql.org/docs/9.1 /static/indexes-unique.html
Als uniciteit van bepaalde regels afhangt, gebruikt u CREATE UNIQUE INDEX
, bijvoorbeeld:
Gezien dit:
CREATE TABLE tbl
(
a_id integer NOT NULL,
b_id integer NULL
);
alter table tbl
add constraint tbl_unique unique(a_id, b_id);
Die unieke kan deze duplicaten opvangen, dit wordt door de database afgewezen:
insert into tbl values
(1,1),
(1,1);
Maar die UNIEKE BEPERKING kan geen dubbele nulls opvangen. Nulls dienen als onbekend, ze dienen als wildcard, daarom is het toegestaan om meerdere nulls te hebben met een unieke beperking. Dit wordt geaccepteerd door de database:
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
Denk aan UNIQUE CONSTRAINT
dat het uitgestelde uniciteit mogelijk maakt, vandaar de acceptatie van null-waarden hierboven.
Als u slechts één jokerteken (null b_id) per a_id wilt, moet u, afgezien van de unieke beperking, een UNIQUE INDEX
toevoegen . UNIQUE CONSTRAINT kan er geen uitdrukking op hebben. INDEX
en UNIQUE INDEX
kan. Dit wordt je volledige DDL voor het afwijzen van meerdere nulls;
Dit wordt je volledige 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;
Dit wordt nu afgewezen door uw database:
insert into tbl values
(1,1),
(1,null),
(1,null);
Dit is toegestaan:
insert into tbl values
(1,1),
(1,null);
Gerelateerd aan http://www.ienablemuch .com/2010/12/postgresql-said-sql-server2008-said-non.html