2012-08-08 24 views
47

मैं कई बार निम्न सिंटैक्स जो एक परिवर्तन/बनाने DDL बयान में एक स्तंभ को परिभाषित करता है देखा है:एसक्यूएल कॉलम परिभाषा: डिफ़ॉल्ट मान और शून्य अनावश्यक नहीं है?

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault" 

सवाल है: भी स्तंभ निर्दिष्ट करने के लिए के बाद से एक डिफ़ॉल्ट मान निर्दिष्ट किया जाता है, यह आवश्यक है एनयूएलएल स्वीकार नहीं करना चाहिए? दूसरे शब्दों में, क्या डिफ़ॉल्ट रूप से पूर्ण अनावश्यक प्रस्तुत नहीं करता है?

उत्तर

69

DEFAULT साथ बनाया गया था नहीं दूँगी मूल्य है कि एक सम्मिलित/अपडेट बयान में एक स्पष्ट मूल्य के अभाव में सम्मिलित किया जाएगा है। SQL-1992 मानक के अनुसार,

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" 

तो फिर तुम इन बयानों

-- 1. This will insert "MyDefault" into tbl.col 
INSERT INTO tbl (A, B) VALUES (NULL, NULL); 

-- 2. This will insert "MyDefault" into tbl.col 
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, DEFAULT); 

-- 3. This will insert "MyDefault" into tbl.col 
INSERT INTO tbl (A, B, col) DEFAULT VALUES; 

-- 4. This will insert NULL into tbl.col 
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, NULL); 

वैकल्पिक रूप से जारी कर सकता है, तो आप भी UPDATE बयान में DEFAULT उपयोग कर सकते हैं: चलो मान लेते हैं, अपने DDL NOT NULL बाधा नहीं था

-- 5. This will update "MyDefault" into tbl.col 
UPDATE tbl SET col = DEFAULT; 

-- 6. This will update NULL into tbl.col 
UPDATE tbl SET col = NULL; 

नोट, सभी डेटाबेस इन सभी SQL मानक वाक्यविन्यासों का समर्थन नहीं करते हैं। NOT NULL बाधा जोड़ने से 4, 6 कथन के साथ त्रुटि हो जाएगी, जबकि 1-3, 5 अभी भी वैध कथन हैं। तो अपने प्रश्न का उत्तर देने के लिए:

नहीं, NOT NULL और DEFAULT अनावश्यक नहीं हैं। विशेष रूप से, NOT NULL can have a tremendous impact on query performance as explained in this blog post here

8

डिफ़ॉल्ट मान के साथ भी, आप हमेशा कॉलम डेटा को null के साथ ओवरराइड कर सकते हैं।

NOT NULL प्रतिबंध आप उस पंक्ति अद्यतन करने के बाद यह null मूल्य

+0

मुझे लगता है कि इस rephrased जा करना चाहिए: "नहीं NULL प्रतिबंध आप उस पंक्ति को अद्यतन नहीं दूँगी बाद यह शून्य मान से बनाया गया था" का नल कॉलम के साथ पाठ्यक्रम पंक्तियों को अद्यतन किया जा सकता है, वे उस कॉलम के मान के रूप में शून्य के साथ अद्यतन नहीं किया जा सकता है। इसके अलावा: मुझे लगता है कि एक पंक्ति बनाने का अर्थ है एक पंक्ति डालना।INSERT कथन में कॉलम के लिए शून्य मान नहीं हो सकते हैं जो कि न तो नल के साथ निर्दिष्ट हैं। – makrom

0

मैं नहीं कहूंगा।

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

शून्य सेट के साथ, तो आप फ़ील्ड में एक शून्य मान नहीं डाल सकते क्योंकि यह एक त्रुटि फेंक देगा।

इसे नल को रोकने के लिए एक असफल सुरक्षित तंत्र के रूप में सोचें।

1

मेरे एसक्यूएल शिक्षक ने कहा कि अगर आप दोनों एक DEFAULT मूल्य और NOT NULL या NULL निर्दिष्ट करते हैं, DEFAULT हमेशा NOT NULL या NULL से पहले व्यक्त किया जाना चाहिए।

इस तरह

:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NOT NULL

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NULL

+1

हे वहाँ, और भाग लेने के लिए धन्यवाद। यह हाथ पर सवाल का समाधान नहीं करता है, हालांकि, और दोनों आदेश पूरी तरह से प्रभावी हैं। मुझे अंत में डिफॉल्ट डालना आसान लगता है जब मैं मैन्युअल रूप से टेबलिंग स्क्रिप्ट कर रहा हूं क्योंकि तब न्यूल और नॉट नल मान बेहतर संरेखित होते हैं। – emragins

+0

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

+0

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