बहु-स्तंभ प्राथमिक कुंजी में NULL के साथ मौलिक रूप से कुछ भी गलत नहीं है। लेकिन एक होने का मतलब है कि डिजाइनर की यह मंशा नहीं थी, यही वजह है कि जब आप यह कोशिश करते हैं तो कई सिस्टम एक त्रुटि फेंक देते हैं।
खेतों की एक श्रृंखला के रूप में संग्रहीत मॉड्यूल / पैकेज संस्करणों के मामले पर विचार करें:
CREATE TABLE module
(name varchar(20) PRIMARY KEY,
description text DEFAULT '' NOT NULL);
CREATE TABLE version
(module varchar(20) REFERENCES module,
major integer NOT NULL,
minor integer DEFAULT 0 NOT NULL,
patch integer DEFAULT 0 NOT NULL,
release integer DEFAULT 1 NOT NULL,
ext varchar(20),
notes text DEFAULT '' NOT NULL,
PRIMARY KEY (module, major, minor, patch, release, ext));
प्राथमिक कुंजी के पहले 5 तत्व नियमित रूप से एक रिलीज़ संस्करण के कुछ हिस्सों को परिभाषित करते हैं, लेकिन कुछ पैकेजों में एक अनुकूलित एक्सटेंशन होता है जो आमतौर पर पूर्णांक नहीं होता है (जैसे "आरसी-फू" या "वेनिला" या "बीटा" या जो भी किसी के लिए हो जिनके चार क्षेत्र अपर्याप्त हैं वे सपने देख सकते हैं)। यदि किसी पैकेज में एक्सटेंशन नहीं है, तो यह उपरोक्त मॉडल में NULL है, और इस तरह से चीजों को छोड़ने से कोई नुकसान नहीं होगा।
लेकिन NULL क्या है ? यह जानकारी की कमी का प्रतिनिधित्व करने वाला है , एक अज्ञात। उस ने कहा, शायद यह अधिक समझ में आता है:
CREATE TABLE version
(module varchar(20) REFERENCES module,
major integer NOT NULL,
minor integer DEFAULT 0 NOT NULL,
patch integer DEFAULT 0 NOT NULL,
release integer DEFAULT 1 NOT NULL,
ext varchar(20) DEFAULT '' NOT NULL,
notes text DEFAULT '' NOT NULL,
PRIMARY KEY (module, major, minor, patch, release, ext));
इस संस्करण में टपल का "एक्सट" हिस्सा NULL नहीं है, लेकिन खाली स्ट्रिंग में चूक है - जो शब्दार्थ (और व्यावहारिक रूप से) NULL से अलग है। NULL एक अज्ञात है, जबकि एक खाली स्ट्रिंग "कुछ मौजूद नहीं है" का एक जानबूझकर रिकॉर्ड है। दूसरे शब्दों में, "खाली" और "अशक्त" अलग-अलग चीजें हैं। इसका अंतर "मुझे यहाँ कोई मूल्य नहीं है" और "मुझे नहीं पता कि यहाँ क्या मूल्य है।"
जब आप एक पैकेज को पंजीकृत करते हैं जिसमें एक संस्करण एक्सटेंशन का अभाव होता है तो आपको पता है कि इसमें एक एक्सटेंशन का अभाव है, इसलिए एक खाली स्ट्रिंग वास्तव में सही मूल्य है। एक NULL केवल तभी सही होगा जब आपको पता नहीं था कि इसमें कोई एक्सटेंशन है या नहीं, या आप जानते हैं कि यह किया था लेकिन यह नहीं जानता था कि यह क्या था। यह स्थिति उन प्रणालियों से निपटने में आसान है जहां स्ट्रिंग मान आदर्श हैं, क्योंकि 0 या 1 डालने के अलावा "खाली पूर्णांक" का प्रतिनिधित्व करने का कोई तरीका नहीं है, जो बाद में किए गए किसी भी तुलना में लुढ़का होगा (जो है) अपने स्वयं के निहितार्थ) *।
संयोग से, दोनों तरीके Postgres में मान्य हैं (क्योंकि हम "एंटरप्राइज़" RDMBSs पर चर्चा कर रहे हैं), लेकिन तुलना परिणाम काफी भिन्न हो सकते हैं जब आप NULL को मिश्रण में फेंकते हैं - क्योंकि NULL == "सभी नहीं जानते" तुलना के परिणाम में एक NULL हवा शामिल होना NULL है क्योंकि आप कुछ ऐसा नहीं जान सकते जो अज्ञात है। खतरा! उसके बारे में ध्यान से सोचें: इसका मतलब है कि NULL तुलना परिणाम तुलनाओं की एक श्रृंखला के माध्यम से प्रचारित करते हैं । यह छँटाई, तुलना आदि के दौरान सूक्ष्म कीड़ों का स्रोत हो सकता है।
पोस्टग्रेज मानते हैं कि आप एक वयस्क हैं और अपने लिए यह निर्णय ले सकते हैं। ओरेकल और डीबी 2 मान लेते हैं कि आपको एहसास नहीं हुआ कि आप कुछ मूर्खतापूर्ण कर रहे हैं और एक त्रुटि है। ये है आमतौर पर सही बात है, लेकिन हमेशा नहीं - आप वास्तव में नहीं जानते हैं और कुछ मामलों में NULL हो सकते हैं और इसलिए एक अज्ञात तत्व के साथ एक पंक्ति छोड़ना जिसके खिलाफ सार्थक तुलना असंभव है सही व्यवहार है।
किसी भी मामले में आपको पूरे स्कीमा में अनुमति देने वाले NULL फ़ील्ड की संख्या को समाप्त करने का प्रयास करना चाहिए और जब यह प्राथमिक फ़ील्ड का एक हिस्सा होता है तो दोगुना हो जाता है। अधिकांश मामलों में NULL कॉलम की उपस्थिति संयुक्त राष्ट्र के सामान्यीकृत होने का संकेत है (जैसा कि जानबूझकर डी-सामान्यीकृत किया गया है) स्कीमा डिज़ाइन के विपरीत और स्वीकार किए जाने से पहले इसके बारे में बहुत कठिन सोचा जाना चाहिए।
[* नोट: एक कस्टम प्रकार बनाना संभव है जो पूर्णांकों का संघ है और एक "निचला" प्रकार है जो "अज्ञात" के विपरीत "खाली" शब्द का अर्थ होगा। दुर्भाग्य से यह तुलनात्मक संचालन में थोड़ी जटिलता का परिचय देता है और आमतौर पर सही प्रकार से सही होना व्यवहार में प्रयास के लायक नहीं है क्योंकि आपको NULL
पहली बार में कई मूल्यों की अनुमति नहीं दी जानी चाहिए । उस ने कहा, यह बहुत अच्छा होगा यदि RDBMS में "अज्ञात मान" के साथ "नो वैल्यू" के शब्दार्थ को अनौपचारिक रूप से भ्रमित करने की आदत को रोकने के BOTTOM
अलावा एक डिफ़ॉल्ट प्रकार शामिल होगा NULL
। ]