सख्ती से बोलना, एक अद्वितीय अशक्त स्तंभ (या स्तंभों का समूह) केवल एक बार NULL (या NULLs का रिकॉर्ड) हो सकता है, क्योंकि एक ही मूल्य (और इसमें NULL शामिल है) एक से अधिक बार स्पष्ट रूप से अद्वितीय बाधा का उल्लंघन करता है।
हालांकि, इसका मतलब यह नहीं है कि "अद्वितीय नल योग्य कॉलम" की अवधारणा वैध है; वास्तव में इसे किसी भी संबंधपरक डेटाबेस में लागू करने के लिए हमें बस यह ध्यान रखना है कि इस तरह के डेटाबेस को ठीक से काम करने के लिए सामान्यीकृत किया जाए, और सामान्यीकरण में आमतौर पर संस्थाओं के बीच संबंध स्थापित करने के लिए कई (गैर-इकाई) अतिरिक्त तालिकाओं को शामिल किया जाता है। ।
आइए केवल एक "अद्वितीय नल योग्य स्तंभ" पर विचार करते हुए एक मूल उदाहरण पर काम करें, ऐसे अधिक स्तंभों तक इसका विस्तार करना आसान है।
मान लीजिए कि हम एक तालिका द्वारा प्रस्तुत की गई जानकारी इस तरह से हैं:
create table the_entity_incorrect
(
id integer,
uniqnull integer null, /* we want this to be "unique and nullable" */
primary key (id)
);
हम ऐसा नहीं कर सकते uniqnull को अलग करके और uniqnull मानों के बीच एक संबंध स्थापित करने के लिए दूसरी तालिका जोड़कर the_entity ("the_entity के अंदर uniqnull" होने के बजाय):
create table the_entity
(
id integer,
primary key(id)
);
create table the_relation
(
the_entity_id integer not null,
uniqnull integer not null,
unique(the_entity_id),
unique(uniqnull),
/* primary key can be both or either of the_entity_id or uniqnull */
primary key (the_entity_id, uniqnull),
foreign key (the_entity_id) references the_entity(id)
);
The_entity में हमें एक पंक्ति में uniqnull के मान को जोड़ने के लिए हमें the_relation में एक पंक्ति भी जोड़ने की आवश्यकता है।
In_entity में पंक्तियाँ नहीं थीं क्योंकि कोई भी असंबद्ध मान जुड़े नहीं हैं (अर्थात हम जिन्हें NULL__ityity_incorrect में डालेंगे) हम केवल the_relation में एक पंक्ति नहीं जोड़ते हैं।
ध्यान दें कि uniqnull के लिए मान सभी the_relation के लिए अद्वितीय होंगे, और यह भी ध्यान दें कि in_entity में प्रत्येक मान के लिए the_relation में अधिकतम एक मान हो सकता है, क्योंकि इस पर प्राथमिक और विदेशी कुंजियाँ इसे लागू करती हैं।
फिर, अगर uniqnull के लिए 5 का मान 3 की a_entity आईडी के साथ जुड़ा होना है, तो हमें इसकी आवश्यकता होगी:
start transaction;
insert into the_entity (id) values (3);
insert into the_relation (the_entity_id, uniqnull) values (3, 5);
commit;
और, अगर the_entity के लिए 10 की आईडी वैल्यू के लिए कोई अनइकनाल समकक्ष नहीं है, तो हम केवल यह करते हैं:
start transaction;
insert into the_entity (id) values (10);
commit;
इस जानकारी को निरूपित करने और डेटा को the_entity_incorrect की तरह एक तालिका प्राप्त करने के लिए, हमें निम्न की आवश्यकता होगी:
select
id, uniqnull
from
the_entity left outer join the_relation
on
the_entity.id = the_relation.the_entity_id
;
"लेफ्ट आउटर जॉइन" ऑपरेटर सुनिश्चित करता है कि the_entity की सभी पंक्तियाँ परिणाम में दिखाई देंगी, NULL को यूनीकनल कॉलम में रखें जब कोई मिलान कॉलम the_relation में मौजूद न हो।
याद रखें, एक अच्छी तरह से सामान्यीकृत डेटाबेस (और इसी तरह के विचारों और प्रक्रियाओं को डिजाइन करने में) कुछ दिनों (या हफ्तों या महीनों) के लिए खर्च किए गए किसी भी प्रयास से आपको दर्द और व्यर्थ संसाधनों के वर्षों (या दशकों) की बचत होगी।