2012-09-03 4 views
14

एसक्यूएल के कई स्वादों में, तीन पंक्तियां हैं जो आप प्रत्येक पंक्ति सम्मिलन पर पूर्ण रूप से कॉलम को एनयूएलएल सेट कर सकते हैं। येडिफ़ॉल्ट शून्य के साथ MySQL कॉलम - स्टाइलिस्ट पसंद, या यह है?

columnname type NULL 
columnname type DEFAULT NULL 
columnname type NULL DEFAULT NULL 

यानी पहले एक शून्य झंडा सेट (के रूप में नहीं शून्य के खिलाफ), दूसरा एक डिफ़ॉल्ट मान पर शून्य झंडा छोड़ देता है, और तीसरा एक शून्य झंडा सेट करता है और अंतर्निहित मूल्य के रूप में सेट कर रहे हैं शून्य।

मैंने माइक्रोसॉफ्ट एसक्यूएल में कैसे सुना है, दूसरी भिन्नता बिल्कुल वही नहीं है क्योंकि आप टेबल या स्कीमा के लिए नल फ्लैग के डिफ़ॉल्ट मान को भी कस्टमाइज़ कर सकते हैं।

लेकिन MySQL के लिए, मुझे विश्वास नहीं है कि ऐसी सुविधा है। इसके अलावा, MySQL में, नल फ्लैग वाले कॉलम, नल कॉलम के विपरीत, अगर कोई स्पष्ट मूल्य नहीं है, भले ही सख्त मोड चालू हो, तो हमेशा निहित पर पूर्ण पर सेट किया जाता है। इसलिए ये सभी कॉलम घोषणाओं को समान छोड़ देता है।

मेरी माईएसQL स्क्रिप्ट में, प्रत्येक नल कॉलम के लिए, मैं कॉलम के लिए एक डिफॉल्ट मान निर्दिष्ट करता हूं, यदि मैं सख्त मोड सक्षम करना चाहता हूं तो किसी भी मुद्दे से बचने के लिए, मेरे आवेदन में कुछ प्रविष्टियों में सेट करने की उम्मीद नहीं है। इस प्रकार, मुझे लगता है कि अगर मैं तीसरा विविधता चुनना चाहता हूं, तो यह अधिक सममित होगा और भले ही यह सबसे अधिक verbose और स्पष्ट है। क्या तीसरे बदलाव की तरह आम घोषणाएं हैं, या क्या पहली या दूसरी भिन्नता दूसरों की लिपियों में अधिक बार होती है?

मैं दूसरे दृष्टिकोण पर झुकाव पर विचार कर रहा था क्योंकि यह मेरा उपनाम है कि MySQL डंप का उपयोग करता है, लेकिन मुझे यकीन नहीं है कि यह एक अच्छा विचार है क्योंकि यह कॉलम घोषणाओं के डिफ़ॉल्ट खंडों में तारों (सिंगल कोट्स) के रूप में पूर्णांक अक्षर को भी डंप करता है ।

यह प्रश्न समाधान के मुकाबले ज्यादा राय हो सकता है, लेकिन मैं किसी भी संभावित गठिया से अवगत होना चाहता हूं जिसे मुझे पता नहीं है। मैं भविष्य में MySQL से PostgreSQL में माइग्रेट करना चुन सकता हूं, और मैं उन विशेषज्ञों से कुछ सलाह भी उपयोग कर सकता हूं, उदा। यदि PostgreSQL इन मामलों को अलग करता है जैसे एमएस-एसक्यूएल करता है। यदि मैं गलत गलती करता हूं तो मैं गलत हूं अगर मैं गलत हूं।

+1

मुझे यकीन नहीं है कि आप जानते हैं, लेकिन MySQL में आप एक शून्य मान के लिए एक डिफ़ॉल्ट मान (जो शून्य नहीं है) सेट कर सकते हैं। यदि आप डालने के दौरान उस कॉलम के लिए मान निर्दिष्ट करने में विफल रहते हैं, तो कॉलम का डिफ़ॉल्ट मान होता है। आप यह भी स्पष्ट रूप से निर्दिष्ट कर सकते हैं कि शून्य को डालना है, जिस स्थिति में कॉलम शून्य है। उदाहरण के लिए, आप कॉलम को 'SMALLINT DEFAULT 3' के रूप में निर्दिष्ट कर सकते हैं। फिर यदि आप स्पष्ट रूप से एक गैर-शून्य पूर्णांक मान डालते हैं, तो यह उस मान को संग्रहीत करता है; यदि आप स्पष्ट रूप से शून्य डालते हैं, तो यह शून्य को संग्रहीत करता है; और यदि आप डालने पर मान निर्दिष्ट नहीं करते हैं, तो यह 3, डिफ़ॉल्ट मान संग्रहीत करता है। – Hammerite

+0

हाँ! मैं केवल कॉलम के बारे में चिंतित हूं जिनके पास शून्य का डिफ़ॉल्ट मान है। –

+0

शायद यह प्रश्न [programmers.se] के लिए अधिक उपयुक्त है? – eggyal

उत्तर

9

प्रत्येक डेटाबेस जो मैंने सामना किया है, वह आपको बताता है कि जिस तरह से आप उनका वर्णन करते हैं। जब कोई कॉलम NULL मान स्वीकार करता है, तो INSERT पर कोई मान प्रदान नहीं करता है तो वह मान को शून्य पर डिफ़ॉल्ट करता है। मेरा मानना ​​है कि यह एएनएसआई मानक व्यवहार का हिस्सा है।

स्वयं "न्यूल" निर्दिष्ट करने के लिए। यह वरीयता का मामला है। मानक कहता है कि एक कॉलम NULLs की अनुमति देता है जब तक कि न्यूल निर्दिष्ट नहीं है (डेटा परिभाषा भाषा के स्तर पर)। तो, शून्य ही अनावश्यक है, और आप एक चौथाई, बराबर विकल्प होता है:

columnname type 

NULLs काफी एएनएसआई मानक के माध्यम से एसक्यूएल भाषा में एम्बेडेड रहे हैं। आपका तीसरा विकल्प सबसे स्पष्ट है, लेकिन यह थोड़ा असामान्य दिखता है।

यदि आप अपने सिस्टम में सुपर-संगत होने की योजना बना रहे हैं, तो मैं उस पथ को ले जाऊंगा जिस पर आप हैं। प्रत्येक तालिका में प्रत्येक कॉलम के लिए नल या न्यूल नहीं है। डिफ़ॉल्ट मान लेने वाले सभी कॉलम के लिए, DEFAULT कथन है।

हालांकि, इस उदाहरण का आसानी से अनुसरण करने के लिए अन्य लोगों (अब या भविष्य में) के साथ काम करने की अपेक्षा न करें। कई इस मामले में चौथे विकल्प को पसंद करेंगे क्योंकि इसे कम टाइपिंग की आवश्यकता होती है और यह है कि कैसे सभी (या लगभग सभी) एसक्यूएल बोलियां व्यवहार करती हैं।

+0

हाँ। लगभग कोई भी 'सभी को चुनें' स्पष्ट नहीं लिखता है लेकिन अंतर्निहित (और समतुल्य) 'चयन' का उपयोग करता है। –

+0

हालांकि eggyal के महान अंक थे (और MySQL दस्तावेज़ीकरण का संदर्भ), आपकी जानकारी ने यह स्पष्ट कर दिया कि यह सिर्फ एक MySQL एक के बजाय एक SQL मानक था। जैसा कि मुझे विश्वास है कि अगर मुझे डेटाबेस सिस्टम बदलना है, तो मुझे कॉलम परिभाषाओं के इस विशेष भाग पर फिर से विचार नहीं करना पड़ेगा, और अधिकांश को निहित संशोधकों के बारे में पता होना चाहिए, मैं आपके द्वारा दिए गए सबसे संक्षिप्त उपनामों के साथ रहूंगा। धन्यवाद! –

18

Data Type Default Values के तहत दस्तावेज के रूप में:

स्तंभ एक मूल्य के रूप में NULL ले जा सकते हैं तो कॉलम में एक स्पष्ट DEFAULT NULL खंड के साथ परिभाषित किया गया है।

(मुझे लगता है कि वे निहित, नहीं स्पष्ट मतलब)।

इसके अलावा, के रूप में CREATE TABLE Syntax के तहत दस्तावेज:

तो न NULL है और न ही NOT NULL निर्दिष्ट किया जाता है, स्तंभ व्यवहार किया जाता है जैसे कि NULL निर्दिष्ट किया गया था।

इसलिए, MySQL में निम्नलिखित कॉलम परिभाषाएँ सब समान हैं:

columnname type 
columnname type NULL 
columnname type DEFAULT NULL 
columnname type NULL DEFAULT NULL 

जिनमें से उपयोग करने के लिए विकल्प स्पष्ट किया जा रहा है, और संक्षिप्त होने के बीच एक संतुलन है। परिस्थितियों के आधार पर, मैं उपर्युक्त में से किसी का भी उपयोग कर सकता हूं।

+2

ध्यान दें कि 'TIMESTAMP' प्रकार के साथ एक बढ़त मामला है। यदि आपका कॉलम 'स्टाम्प टाइमस्टैम्प 'के रूप में घोषित किया गया है, और आप' STamp' के मान को निर्दिष्ट करते हुए एक INSERT w/o करते हैं, तो यह वर्तमान यूटीसी डेटाटाइम के मूल्य के साथ INSERTING के लिए डिफ़ॉल्ट होगा। यदि आप कॉलम को 'स्टाम्प टाइमस्टैम्प नल' के रूप में घोषित करते हैं, तो INSERT डिफ़ॉल्ट रूप से डिफ़ॉल्ट हो जाएगा। – user2426679

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