2010-10-22 14 views
44

मैं एक स्तंभ जो मैं के रूप में नहीं NULL निर्दिष्ट है जोड़ सकते हैं, मैं डिफ़ॉल्ट मान निर्दिष्ट नहीं करना चाहते हैं, लेकिन MS-एसक्यूएल 2005 का कहना है:मैं डिफ़ॉल्ट मान के बिना एक नहीं अशक्त स्तंभ जोड़ सकते हैं

ALTER तालिका केवल कॉलम को जोड़ने की अनुमति देती है जिसमें नल शामिल हो सकते हैं, या निर्दिष्ट डिफॉल्ट परिभाषा हो सकती है, या जोड़ा जा रहा कॉलम एक पहचान या टाइमस्टैम्प कॉलम है, या वैकल्पिक रूप से यदि पिछली स्थितियों में से कोई भी संतुष्ट नहीं है तो तालिका को खाली करने की अनुमति देने के लिए खाली होना चाहिए यह कॉलम कॉलम 'टेस्ट' को गैर-खाली तालिका 'shiplist' में जोड़ा नहीं जा सकता क्योंकि यह इन शर्तों को पूरा नहीं करता है।

यदि हां, तो कृपया मुझे वाक्यविन्यास बताएं, अगर नहीं, तो कारण बताएं।

उत्तर

59

नहीं, आप नहीं कर सकते।

क्योंकि यदि आप कर सकते हैं, तो एसक्यूएल नहीं जानता कि पहले से मौजूद रिकॉर्ड्स में मूल्य के रूप में क्या रखा जाए। यदि आपके पास टेबल में कोई रिकॉर्ड नहीं है तो यह बिना किसी समस्या के काम करेगा।

ऐसा करने का सबसे आसान तरीका डिफ़ॉल्ट के साथ कॉलम बना रहा है और फिर डिफ़ॉल्ट को हटा दें।

ALTER TABLE dbo.MyTable ADD 
MyColumn text NOT NULL CONSTRAINT DF_MyTable_MyColumn DEFAULT 'defaultValue' 
ALTER TABLE dbo.MyTable 
DROP CONSTRAINT DF_MyTable_MyColumn 

एक और विकल्प बाधा के बिना कॉलम जोड़ना, सभी कोशिकाओं के लिए मान भरना और बाधा जोड़ना होगा।

8

नहीं - एसक्यूएल सर्वर काफी यथोचित इस को खारिज कर दिया है, क्योंकि यह पता नहीं होगा क्या मूल्य मौजूदा पंक्तियों

होना चाहिए यह एक ही समय में एक डिफ़ॉल्ट बनाना आसान है, और फिर तुरंत छोड़ दें।

18

तालिका में कॉलम जोड़ें, मौजूदा पंक्तियों को अपडेट करें ताकि उनमें से कोई भी शून्य न हो, और फिर "शून्य नहीं" बाधा जोड़ें।

+3

यह/बनाने ड्रॉप डिफ़ॉल्ट तुलना में एक बेहतर समाधान है बिना नहीं NULL स्तंभ सम्मिलित करने के लिए इस दृष्टिकोण का उपयोग, अगर डिफ़ॉल्ट मान निर्दिष्ट करने के लिए विचार कर सकते हैं नए मानों के लिए तर्क एक साधारण स्थिर से अधिक जटिल है। –

+0

क्यों, या कैसे, यह संभवतः अपडेट करने के लिए बेहतर है (मैन्युअल रूप से?) + डिफ़ॉल्ट रूप से स्वचालित रूप से "अपडेट करने" के बजाय "शून्य नहीं" के बदले बदलना + "डिफ़ॉल्ट नहीं है" (डिफ़ॉल्ट ड्रॉप)? –

+0

@ vgv8 - क्या होगा यदि प्रत्येक पंक्ति में नए मान पहले से ही पंक्ति में अन्य कॉलम पर निर्भर करते हैं? आप इसे डिफ़ॉल्ट बाधा के माध्यम से व्यक्त नहीं कर सकते हैं। –

0

सं

बस 0 या (यदि सांख्यिक) (चरित्र प्रकार के मामले में) रिक्त स्ट्रिंग '' का उपयोग, आदि डिफ़ॉल्ट मान के रूप

0

नहीं, आप नहीं कर सकते हैं, एसक्यूएल सर्वर, या किसी भी रूप में अन्य डेटाबेस इंजन इस नई कॉलम को आपकी डेटा तालिका में मौजूदा पंक्तियों के लिए शून्य होने के लिए मजबूर करेंगे। लेकिन चूंकि आप एक पूर्ण अनुमति नहीं देते हैं, इसलिए आपको अपनी बाधा का सम्मान करने के लिए एक डिफ़ॉल्ट मान प्रदान करना होगा। यह बहुत समझ में आता है! डीबीई मौजूदा पंक्तियों के लिए गैर-शून्य मानों के लिए मूल्य को extrapolate नहीं करेगा।

+0

देखें, जबकि आप जो कहते हैं, वह समझ में आता है, कम से कम एक "डेटाबेस इंजन" एमएस एक्सेस होने के बारे में सच नहीं है, जो 'न्यूल न्यूल' कॉलम को अनुमति देता है एक 'डिफॉल्ट' निर्दिष्ट करने के बिना तालिका में जोड़ा गया, आर जिसका नतीजा 'न्यूल न्यूल' कॉलम में शून्य मान है। मैं प्रमाण के रूप में सबूत प्रदान करूंगा ... – onedaywhen

0

@Damien_The_Unbeliever's comment, क्या यह गणना कॉलम जोड़ रहा है? कोई सवाल नहीं है और न ही इस तरह के कुछ भी जवाब दिया है। त्रुटि राज्यों अभिकलन स्तंभ के मामले में:

"केवल अद्वितीय या प्राथमिक कुंजी बाधाओं, अभिकलन स्तंभों पर बनाया जा सकता है, जबकि जांच, विदेशी कुंजी है, और नहीं शून्य की कमी की आवश्यकता है कि गणना कॉलम कायम किया"

ठीक है, अगर यह अनुमान लगाने का खेल जारी रखने के लिए, यहाँ मेरी स्क्रिप्ट में "नहीं NULL" कॉलम के जोड़ने को दर्शाता हुआ है "परिवर्तन तालिका" कदम:

CREATE TABLE TestInsertComputedColumn 
(
    FirstName VARCHAR(100), 
    LastName CHAR(50) 
); 

insert into TestInsertComputedColumn(FirstName,LastName) 
    select 'v', 'gv8'; 
select * from TestInsertComputedColumn; 

ALTER TABLE TestInsertComputedColumn 
     ADD FullName As FirstName + LastName PERSISTED NOT NULL; 

select * from TestInsertComputedColumn; 
--drop TABLE TestInsertComputedColumn; 
1

नहीं, तुम नहीं कर सकते।लेकिन आप के लिए ('')

1

मैं डिफ़ॉल्ट मान

ALTER TABLE [Table] ADD [Column] INT NULL 
GO 
UPDATE [Table] SET [Column] = <default_value> 
ALTER TABLE [Table] ALTER COLUMN [Column] INT NOT NULL 
संबंधित मुद्दे