SQL कॉलम परिभाषा: डिफ़ॉल्ट मान और निरर्थक नहीं?


86

मैंने कई बार निम्नलिखित सिंटैक्स देखा है जो डीडीएल स्टेटमेंट बनाने / बदलने में एक कॉलम को परिभाषित करता है:

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

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

जवाबों:


126

DEFAULTवह मूल्य है जो किसी इंसर्ट / अपडेट स्टेटमेंट में स्पष्ट मूल्य के अभाव में डाला जाएगा। मान लें, आपके DDL में NOT NULLबाधा नहीं थी :

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);

वैकल्पिक रूप से, आप SQL-1992 मानक के अनुसार, बयानों DEFAULTमें भी उपयोग कर सकते हैं :UPDATE

-- 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अभी भी मान्य कथन हैं। तो आपके प्रश्न का उत्तर देने के लिए: नहीं, वे निरर्थक नहीं हैं।


मैं आपके लिंक पर (आपके ब्लॉग पोस्ट पर) क्वेरी के प्रदर्शन पर जबरदस्त प्रभाव के स्पष्टीकरण (संभवतः कुछ नंबरों के साथ) देखने की उम्मीद कर रहा था, लेकिन केवल इसे संक्षेप में देखा कि इसका प्रभाव है। कोई अपराध नहीं है, लेकिन लिंक थोड़ा भ्रामक है।
सेठ फूल

@ सैथफ्लॉवर: पॉइंटर के लिए धन्यवाद, सेठ। जुड़ा हुआ लेख इस बीच संपादित हो गया। मैं देखूंगा कि क्या मैं इसके बजाय कुछ और लिंक कर सकता हूं, या लिंक हटा सकता हूं। जैसा कि यह अब है, आप बिल्कुल सही हैं, यह यहाँ उत्तर के लिए कोई मूल्य नहीं जोड़ता है।
लुकास ईडर

धन्यवाद - मुझे आशा है कि मैं असभ्य नहीं था। मैंने बस लिंक देखा और "हाँ, यह निश्चित रूप से कुछ ऐसा है जिसे मैं पढ़ना चाहता हूं" - फिर थोड़ा सा नीचे था :)।
सेठ फूल

@SethFlowers: कोई चिंता नहीं। मैं पूरी तरह से सहमत। मेरे बचाव के लिए: मेरे ब्लॉगिंग कौशल में पिछले वर्षों में काफी सुधार हुआ है :)
लुकास ईडर

19

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

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


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

4

मेरे एसक्यूएल शिक्षक ने कहा कि अगर आप दोनों एक निर्दिष्ट 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


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

ठीक है, मुझे लगता है कि तुम भी सही हो। मुझे यह नहीं सूझ रहा है कि मेरे उत्तर पर लिखे गए मेरे पाठ्यक्रम को स्पष्ट रूप से क्यों कहा जाए। मुझे पता है कि मेरा जवाब वास्तव में सवाल का जवाब नहीं देता है, लेकिन मैंने पाया कि एक टिप्पणी बहुत पठनीय नहीं होगी।
टंगू लैब्राडोर रुइज

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

शायद इस सवाल का जवाब नहीं है। लेकिन वह वही है जिसकी मुझे तलाश थी। धन्यवाद।
सासुके उचिहा

2

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

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

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

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


2
आपने a एक नए नियम का निर्माण ’कहा। क्या आपने 'नई पंक्ति का निर्माण' कहने का इरादा किया था?
बीलवस्की

मुझे लगता है कि इस प्रश्न का अधिक व्यावहारिक उत्तर है।
नोमान_ब्राहिम

@ बीलवास्की और लगभग 8 साल बाद, मैं उस टाइपो को सही करने के लिए चारों ओर पहुँच गया :)
डार्क हिप्पो

यह एक स्पष्ट जवाब होना चाहिए। ओपी एक साधारण सवाल पूछता है और जवाब बस "नहीं" है। हालांकि प्रलेखन के लिए स्पष्टीकरण और उदाहरण की आवश्यकता है।
निकोलस हेविया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.