Sebagai Kunci Utama
Lakukan ini jika unik itu adalah kunci utama:
create table tbl(
a_id int not null,
b_id int not null,
constraint tbl_pkey primary key(a_id,b_id)
);
Bukan Kunci Utama
Lakukan ini jika unik itu bukan kunci utama:
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)
);
Tabel yang Ada
Jika Anda sudah memiliki tabel, lakukan ini sebagai gantinya:
alter table tbl
add constraint tbl_unique unique(a_id, b_id)
Tabel perubahan itu menampilkan pesan ini:
NOTICE: ALTER TABLE / ADD UNIQUE will create implicit index "tbl_unique" for table "tbl"
Query returned successfully with no result in 22 ms.
Lepas
Jika Anda ingin menghilangkan batasan itu (Anda mungkin ingin membuat kombinasi unik dari 3 bidang):
ALTER TABLE tbl DROP CONSTRAINT tbl_unique;
Indeks &Batasan &Nulls
Mengenai indeks, dari dokumen Postgres:
Sumber:http://www.postgresql.org/docs/9.1 /static/indexes-unique.html
Jika keunikan tergantung pada beberapa aturan, Anda harus menggunakan CREATE UNIQUE INDEX
, misalnya:
Mengingat ini:
CREATE TABLE tbl
(
a_id integer NOT NULL,
b_id integer NULL
);
alter table tbl
add constraint tbl_unique unique(a_id, b_id);
Unik itu dapat menangkap duplikat ini, ini akan ditolak oleh database:
insert into tbl values
(1,1),
(1,1);
Namun UNIQUE CONSTRAINT tidak dapat menangkap null duplikat. Nulls berfungsi sebagai tidak diketahui, mereka berfungsi sebagai wildcard, itu sebabnya diizinkan untuk memiliki beberapa nol dalam batasan unik. Ini akan diterima oleh 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
Pikirkan UNIQUE CONSTRAINT
bahwa itu memungkinkan keunikan yang ditangguhkan, maka penerimaan nilai nol di atas.
Jika Anda hanya menginginkan satu wildcard(null b_id) per a_id, selain dari batasan unik, Anda perlu menambahkan UNIQUE INDEX
. CONSTRAINT UNIK tidak dapat memiliki ekspresi pada mereka. INDEX
dan UNIQUE INDEX
bisa. Ini akan menjadi DDL lengkap Anda untuk menolak banyak null;
Ini akan menjadi DDL lengkap Anda:
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;
Ini akan ditolak oleh database Anda sekarang:
insert into tbl values
(1,1),
(1,null),
(1,null);
Ini akan diizinkan:
insert into tbl values
(1,1),
(1,null);
Terkait dengan http://www.ienablemuch .com/2010/12/postgresql-said-sql-server2008-said-non.html