2009-11-15 8 views

उत्तर

48

शून्य मतलब है कि आप खाने के लिए मान प्रदान करने के लिए ...

नहीं NULL मतलब है कि आप क्षेत्रों के लिए एक मूल्य प्रदान करनी चाहिए नहीं है।

उदाहरण के लिए, यदि आप किसी सिस्टम के लिए पंजीकृत उपयोगकर्ताओं की एक तालिका बना रहे हैं, तो आप यह सुनिश्चित करना चाहते हैं कि उपयोगकर्ता-आईडी हमेशा एक मान (यानी न्यूल नहीं) के साथ आबादी हो, लेकिन वैकल्पिक पति/पत्नी नाम फ़ील्ड खाली छोड़ें (एनयूएलएल)

+3

सरल जवाब देने के किसी को भी दिया है हो सकता है। ;) – Zack

+0

जेडीबीसी के बाहर, MySQL आपको कॉलम पर 'डिफॉल्ट' होने पर 'नॉट न्यूल' कॉलम * के लिए मान छोड़ने देता है। मैंने देखा है कि ऐसा कुछ प्रोग्रामर को समझ में नहीं आता है, लेकिन इस तरह यह काम करता है। – staticsan

+1

@staticsan यह सच नहीं है, या कम से कम बहुत भ्रामक है, यह कहने के लिए कि "MySQL आपको 'नल नल' कॉलम के लिए मान छोड़ने देता है" - कुछ मूल्य प्रदान किया जाना चाहिए (यह बिल्कुल सही नहीं है ', और यदि आप इसे आपूर्ति न करें तो MySQL 'DEFAULT' मान की आपूर्ति करेगा। यदि कॉलम 'DEFAULT' मान को परिभाषित नहीं करता है, तो सख्त मोड सक्षम नहीं होने पर MySQL डेटा प्रकार के लिए निहित डिफ़ॉल्ट मान प्रदान कर सकता है। ([डॉक्स लिंक] (https://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html)) – Air

4

NOT NULL मतलब है कि एक कॉलम में NULL मूल्य नहीं कर सकते हैं -, कुछ भी निर्दिष्ट किया जाता है, तो जब उस स्तंभ के लिए एक पंक्ति डालने, यह डिफ़ॉल्ट जो कुछ भी निर्दिष्ट किया जाता है (या कोई डिफ़ॉल्ट निर्दिष्ट किया जाता है, तो उपयोग करेगा बजाय, MySQL के डिफ़ॉल्ट है जो कुछ भी उस प्रकार के लिए)।

फ़ील्ड जो NOT NULL नहीं हैं, उनके संभावित रूप से NULL (जो अनिवार्य रूप से एक लापता/अज्ञात/अनिर्दिष्ट मान का अर्थ है) हो सकता है। NULL सामान्य मानों से भिन्न व्यवहार करता है, see here for more info

+0

अधिक 'तकनीकी' जवाब है, :) – Zack

2

NOT NULL एक स्तंभ बाधा है और आप एक स्तंभ है कि एक प्राथमिक कुंजी में नहीं है जिनमें से आप मान जाएगा हमेशा पता (इसलिए यह स्पष्ट रूप से उनके बारे में NOT NULL कहने के लिए मूर्खतापूर्ण है प्राथमिक कुंजी आंतरिक रूप से नहीं-शून्य कर रहे हैं) है, जब इस्तेमाल किया जाना चाहिए ज्ञात (अज्ञात या अनुपलब्ध नहीं) तो उस कॉलम में नल की आवश्यकता नहीं है।

NULL एक संदर्भ है जो कई संदर्भों में होता है - जिसमें कॉलम बाधा शामिल है, जहां इसका मतलब डिफ़ॉल्ट के रूप में होता है (यानी, नल की अनुमति है) - लेकिन कई अन्य संदर्भों में भी, उदाहरण के लिए INSERT...VALUES कथन के हिस्से के रूप में कॉलम में एक शून्य डालने के लिए।

8

न्यूल और न्यूल के बीच क्या अंतर है?

जब एक तालिका बनाने या एक तालिका में एक कॉलम जोड़ने, आप या तो NULL या NOT NULL का उपयोग कर स्तंभ मान optionality निर्दिष्ट करने के लिए की जरूरत है। NOT NULL का अर्थ है कि किसी भी रिकॉर्ड के लिए कॉलम में NULL मान नहीं हो सकता है; NULL का अर्थ है NULL एक स्वीकार्य मान है (यहां तक ​​कि जब कॉलम में एक विदेशी कुंजी बाधा होती है)। चूंकि NULL कोई मान नहीं है, तो आप देख सकते हैं कि कुछ इसे वैकल्पिकता क्यों कहते हैं - क्योंकि डेटाबेस तालिका के लिए कॉलम रखने के लिए आवश्यक है, तालिका के भीतर प्रत्येक रिकॉर्ड के लिए कॉलम का एक उदाहरण होना चाहिए।

और उनका उपयोग कब किया जाना चाहिए?

यह आपके व्यावसायिक नियमों द्वारा निर्धारित किया जाता है।
आम तौर पर आप NOT NULL होने के लिए जितना संभव हो उतने कॉलम चाहते हैं क्योंकि आप यह सुनिश्चित करना चाहते हैं कि डेटा हमेशा वहां रहता है।

10

मेरा सुझाव है

  • उपयोग हर क्षेत्र पर शून्य नहीं यदि आप
  • उपयोग शून्य अगर वहाँ एक समझदार कारण है यह शून्य

जो नहीं है क्षेत्रों के बाद हो सकता है कर सकते हैं नल नलबल के लिए एक सार्थक अर्थ बग पेश करने की संभावना है, जब नल उन्हें दुर्घटना से दर्ज करते हैं। न्यूल का उपयोग करना इसे रोकता है।

नल फ़ील्ड के लिए सबसे आम कारण यह है कि आपके पास एक विदेशी कुंजी फ़ील्ड है जो विकल्प है, यानी "शून्य या एक" रिश्ते के लिए हमेशा लिंक नहीं होता है।

आप पाते हैं आप कि एक antipattern की तरह लग शुरू होता है कॉलम जिनमें से कई शून्य हो सकता है की बहुत सारी के साथ एक मेज, है, तो विचार करना ऊर्ध्वाधर विभाजन आपके आवेदन संदर्भ :)

एक और उपयोगी है में और अधिक समझ में आता है कि क्या NULL के लिए उपयोग करें - एक इंडेक्स में सभी कॉलम बनाना NULL उस पंक्ति के लिए बनाए गए इंडेक्स रिकॉर्ड को रोक देगा, जो इंडेक्स को अनुकूलित करता है; आप पंक्तियों के केवल एक बहुत ही छोटे सबसेट को इंडेक्स करना चाहते हैं (उदाहरण के लिए केवल एक% या कुछ पर "सक्रिय" ध्वज सेट के लिए) - एक ऐसा इंडेक्स बनाना जो कॉलम से शुरू होता है जो आम तौर पर नल स्पेस बचाता है और उस इंडेक्स को अनुकूलित करता है।

2

यह भी ध्यान दें कि NULL किसी और के बराबर नहीं है, यहां तक ​​कि न्यूल स्वयं भी नहीं।

उदाहरण के लिए:

mysql> select if(NULL=NULL, "null=null", "null!=null"); 
+------------------------------------------+ 
| if(NULL=NULL, "null=null", "null!=null") | 
+------------------------------------------+ 
| null!=null        | 
+------------------------------------------+ 
1 row in set (0.00 sec) 

जब आप एक स्तंभ है कि आंशिक रूप से भर जाता है पर एक अद्वितीय कुंजी की आवश्यकता शून्य की यह परिभाषा बहुत उपयोगी है। ऐसे मामले में आप सभी रिक्त मानों को न्यूल के रूप में छोड़ सकते हैं, और यह विशिष्टता कुंजी के किसी भी उल्लंघन का कारण नहीं बनेंगे, क्योंकि NULL! = NULL।

mysql> select if(null is null, "null is null", "null is not null"); 
+------------------------------------------------------+ 
| if(null is null, "null is null", "null is not null") | 
+------------------------------------------------------+ 
| null is null           | 
+------------------------------------------------------+ 
1 row in set (0.01 sec) 
2

के रूप में दूसरों को जवाब दे दिया है, NOT NULL का अर्थ है कि NULL एक की अनुमति दी मान नहीं है:

यहाँ आप देख सकते हैं कि अगर कुछ शून्य है का एक उदाहरण है। हालांकि, आप कभी आदि रिक्त स्ट्रिंग '' (varchar के लिए) या 0 (int के लिए) का विकल्प होगा,

एक अच्छा फीचर जब NOT NULL का उपयोग कर कि यदि आपको कोई त्रुटि प्राप्त कर सकते हैं या चेतावनी आप सेट भूल जाने पर है स्तंभ की INSERT के दौरान मूल्य। (NOT NULL स्तंभ मानते हुए कोई DEFAULT है)


NULL स्तंभों की इजाजत दी साथ मुख्य हिचकी वे <> (बराबर नहीं) ऑपरेटर के साथ कभी नहीं मिल जाएगा कि है। उदाहरण के लिए, के साथ निम्न category रों

Desktops 
Mobiles 
NULL -- probably embedded devices 

= ऑपरेटर के रूप में उम्मीद

select * from myTable where category="Desktops"; 

हालांकि काम करता है, <> ऑपरेटर किसी भी NULL प्रविष्टियों को बाहर निकाल देगा।

select * from myTable where category<>"Mobiles"; 
-- returns only desktops, embedded devices were not returned 

इस सूक्ष्म कीड़े का कारण हो सकता है, खासकर अगर स्तंभ प्रारंभिक परीक्षण के दौरान कोई NULL डेटा है, लेकिन बाद में कुछ NULL मूल्यों बाद में विकास की वजह से जुड़ जाते हैं। इस कारण से मैंने सभी कॉलम NOT NULL पर सेट किए हैं।


हालांकि, यह NULL मूल्यों अनुमति देने के लिए उपयोगी है जब एक UNIQUEKEY/INDEX का उपयोग कर किया जा सकता है। आम तौर पर एक अनूठी कुंजी को पूरे तालिका के लिए कॉलम (या स्तंभों का संयोजन) अद्वितीय होना आवश्यक है। अद्वितीय कुंजी एक बड़ी सुरक्षा है कि डेटाबेस आपके लिए लागू होगा।

कुछ मामलों में, आप अधिकांश पंक्तियों के लिए सुरक्षा चाहते हैं, लेकिन अपवाद हैं।

यदि उस विशेष UNIQUE KEY द्वारा संदर्भित कोई भी स्तंभ NULL है, तो उस पंक्ति के लिए विशिष्टता अब लागू नहीं की जाएगी। जाहिर है यह केवल तभी काम करेगा यदि आप उस कॉलम पर NULL एस को अनुमति देते हैं, ऊपर बताए गए हिचकी को समझते हैं।


आप, NULL मूल्यों की अनुमति देने के NULL रों पता लगाने के लिए एक अतिरिक्त शर्त के साथ अपने <> बयान लिखने पर विचार करने का फैसला करते।

select * from myTable where category<>"Desktops" or category is null; 
+1

< and > ऑपरेटर के बारे में थोड़ा सा न्यूल के साथ काम नहीं कर रहा एक महत्वपूर्ण अंतर्दृष्टि है, साझा करने के लिए धन्यवाद। –

संबंधित मुद्दे