এই বেসিক কিন্তু গুরুত্বপূর্ণ সমস্যাটি সম্পর্কে আমার কিছু সন্দেহ ছিল, তাই আমি উদাহরণ দিয়ে শিখার সিদ্ধান্ত নিয়েছি।
টেস্ট টেবিল তৈরি করা যাক মাস্টার দুটি কলাম সঙ্গে, con_id অনন্য বাধ্যতা সঙ্গে এবং ind_id অনন্য সূচক দ্বারা সূচীবদ্ধ।
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)
সারণির বিবরণে (ps d পিএসকিএল) আপনি অনন্য সূচক থেকে অনন্য বাধা বলতে পারেন।
অনন্যতা
আসুন স্বতন্ত্রতা পরীক্ষা করা যাক, সেক্ষেত্রে।
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=#
এটি প্রত্যাশার মতো কাজ করে!
বিদেশী চাবি
এখন আমরা দুটি বিদেশী কী দিয়ে বিশদ টেবিলটি সংজ্ঞায়িত করব মাস্টারে আমাদের দুটি কলামে উল্লেখ করে ।
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)
ভাল, কোন ত্রুটি। আসুন নিশ্চিত হয়ে নিন এটি কার্যকরভাবে কাজ করে।
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=#
উভয় কলাম বিদেশী কীতে উল্লেখ করা যেতে পারে।
সূচক ব্যবহার করে বাধা
বিদ্যমান অনন্য সূচকটি ব্যবহার করে আপনি সারণির সীমাবদ্ধতা যুক্ত করতে পারেন।
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)
এখন কলামের সীমাবদ্ধতার বর্ণনার মধ্যে কোনও পার্থক্য নেই।
আংশিক সূচি
সারণি সীমাবদ্ধতার ঘোষণায় আপনি আংশিক সূচক তৈরি করতে পারবেন না। এটা তোলে থেকে সরাসরি আসে সংজ্ঞা এর create table ...
। অনন্য সূচক ঘোষণায় আপনি WHERE clause
আংশিক সূচক তৈরি করতে সেট করতে পারেন। আপনি এক্সপ্রেশনতে সূচকও তৈরি করতে পারেন (কেবল কলামে নয়) এবং কিছু অন্যান্য প্যারামিটার সংজ্ঞায়িত করতে পারেন (কোলিশেশন, সাজানোর ক্রম, NULLs স্থান নির্ধারণ)।
আপনি আংশিক সূচক ব্যবহার করে সারণির সীমাবদ্ধতা যুক্ত করতে পারবেন না ।
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.