Bu temel ama önemli konuda bazı şüphelerim vardı, bu yüzden örnek olarak öğrenmeye karar verdim.
Benzersiz sütunla con_id ve benzersiz dizinle ind_id dizinli iki sütunlu test tablosu yöneticisi oluşturalım .
create table master (
con_id integer unique,
ind_id integer
);
create unique index master_unique_idx on master (ind_id);
Table "public.master"
Column | Type | Modifiers
--------+---------+-----------
con_id | integer |
ind_id | integer |
Indexes:
"master_con_id_key" UNIQUE CONSTRAINT, btree (con_id)
"master_unique_idx" UNIQUE, btree (ind_id)
Tablo açıklamasında (psql cinsinden \ d) benzersiz dizinden benzersiz bir kısıtlama anlatabilirsiniz.
benzersizlik
Her ihtimale karşı benzersizliği kontrol edelim.
test=# insert into master values (0, 0);
INSERT 0 1
test=# insert into master values (0, 1);
ERROR: duplicate key value violates unique constraint "master_con_id_key"
DETAIL: Key (con_id)=(0) already exists.
test=# insert into master values (1, 0);
ERROR: duplicate key value violates unique constraint "master_unique_idx"
DETAIL: Key (ind_id)=(0) already exists.
test=#
Beklendiği gibi çalışıyor!
Yabancı anahtarlar
Şimdi , master'daki iki sütunumuza değinen iki yabancı anahtar içeren ayrıntı tablosunu tanımlayacağız .
create table detail (
con_id integer,
ind_id integer,
constraint detail_fk1 foreign key (con_id) references master(con_id),
constraint detail_fk2 foreign key (ind_id) references master(ind_id)
);
Table "public.detail"
Column | Type | Modifiers
--------+---------+-----------
con_id | integer |
ind_id | integer |
Foreign-key constraints:
"detail_fk1" FOREIGN KEY (con_id) REFERENCES master(con_id)
"detail_fk2" FOREIGN KEY (ind_id) REFERENCES master(ind_id)
Hata yok. Çalıştığından emin olalım.
test=# insert into detail values (0, 0);
INSERT 0 1
test=# insert into detail values (1, 0);
ERROR: insert or update on table "detail" violates foreign key constraint "detail_fk1"
DETAIL: Key (con_id)=(1) is not present in table "master".
test=# insert into detail values (0, 1);
ERROR: insert or update on table "detail" violates foreign key constraint "detail_fk2"
DETAIL: Key (ind_id)=(1) is not present in table "master".
test=#
Her iki sütuna da yabancı anahtarlarda başvurulabilir.
Dizin kullanarak kısıtlama
Mevcut benzersiz dizini kullanarak tablo kısıtı ekleyebilirsiniz.
alter table master add constraint master_ind_id_key unique using index master_unique_idx;
Table "public.master"
Column | Type | Modifiers
--------+---------+-----------
con_id | integer |
ind_id | integer |
Indexes:
"master_con_id_key" UNIQUE CONSTRAINT, btree (con_id)
"master_ind_id_key" UNIQUE CONSTRAINT, btree (ind_id)
Referenced by:
TABLE "detail" CONSTRAINT "detail_fk1" FOREIGN KEY (con_id) REFERENCES master(con_id)
TABLE "detail" CONSTRAINT "detail_fk2" FOREIGN KEY (ind_id) REFERENCES master(ind_id)
Şimdi sütun kısıtlamaları açıklaması arasında fark yoktur.
Kısmi dizinler
Tablo kısıtlaması bildiriminde kısmi dizin oluşturamazsınız. Bu doğrudan gelir tanımı içinde create table ...
. Benzersiz dizin bildiriminde WHERE clause
kısmi dizin oluşturmak için ayarlayabilirsiniz . Ayrıca dizin oluşturabilirsiniz ifadede (yalnızca sütunda değil) ve diğer bazı parametreleri de tanımlayabilirsiniz (harmanlama, sıralama düzeni, NULL yerleştirme).
Sen olamaz kısmi dizini kullanarak tablo kısıtlaması ekleyin.
alter table master add column part_id integer;
create unique index master_partial_idx on master (part_id) where part_id is not null;
alter table master add constraint master_part_id_key unique using index master_partial_idx;
ERROR: "master_partial_idx" is a partial index
LINE 1: alter table master add constraint master_part_id_key unique ...
^
DETAIL: Cannot create a primary key or unique constraint using such an index.