Som primær nøgle
Gør dette, hvis den unikke er primærnøgle:
create table tbl(
a_id int not null,
b_id int not null,
constraint tbl_pkey primary key(a_id,b_id)
);
Ikke primær nøgle
Gør dette, hvis den unikke er en ikke-primær nøgle:
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)
);
Eksisterende tabel
Hvis du har en eksisterende tabel, skal du gøre dette i stedet:
alter table tbl
add constraint tbl_unique unique(a_id, b_id)
Denne ændringstabel viser denne meddelelse:
NOTICE: ALTER TABLE / ADD UNIQUE will create implicit index "tbl_unique" for table "tbl"
Query returned successfully with no result in 22 ms.
Slip
Hvis du ville slippe denne begrænsning (du vil måske lave en unik kombination af 3 felter):
ALTER TABLE tbl DROP CONSTRAINT tbl_unique;
Indeks &begrænsning &nuller
Angående indeks, fra Postgres doc:
Kilde:http://www.postgresql.org/docs/9.1 /static/indexes-unique.html
Hvis unikhed afhænger af nogle regler, skal du bruge CREATE UNIQUE INDEX
, for eksempel:
Givet dette:
CREATE TABLE tbl
(
a_id integer NOT NULL,
b_id integer NULL
);
alter table tbl
add constraint tbl_unique unique(a_id, b_id);
Det unikke kan fange disse dubletter, dette vil blive afvist af databasen:
insert into tbl values
(1,1),
(1,1);
Alligevel kan den UNIKE BEGRÆNSNING ikke fange duplikerede nuller. Nuller fungerer som ukendte, de fungerer som jokertegn, det er derfor, det er tilladt at have flere nuller i en unik begrænsning. Dette vil blive accepteret af databasen:
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
Tænk på UNIQUE CONSTRAINT
at det tillader udskudt unikhed, derfor accepten af nulværdier ovenfor.
Hvis du kun vil have ét jokertegn (null b_id) pr. a_id, bortset fra den unikke begrænsning, skal du tilføje et UNIQUE INDEX
. UNIQUE CONSTRAINT kan ikke have et udtryk på dem. INDEX
og UNIQUE INDEX
kan. Dette vil være din komplette DDL for at afvise flere null;
Dette vil være din komplette 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;
Dette vil blive afvist af din database nu:
insert into tbl values
(1,1),
(1,null),
(1,null);
Dette vil være tilladt:
insert into tbl values
(1,1),
(1,null);
Relateret til http://www.ienablemuch. .com/2010/12/postgresql-said-sql-server2008-said-non.html