किसी मौजूदा तालिका में एक नॉट NULL कॉलम डालें


121

मैंने कोशिश की है:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

लेकिन यह इस त्रुटि संदेश देता है:

तालिका में केवल उन स्तंभों को जोड़ने की अनुमति देता है जिनमें नल हो सकते हैं या इसमें एक परिभाषा परिभाषा निर्दिष्ट हो सकती है

जवाबों:


222

एक विकल्प के रूप में आप शुरू में नल-सक्षम कॉलम बना सकते हैं, फिर अपने टेबल कॉलम को वैध नहीं अशक्त मानों के साथ अपडेट कर सकते हैं और अंत में नॉट बाधा को सेट करने के लिए कॉलम को अपडेट करें:

ALTER TABLE MY_TABLE ADD STAGE INT NULL
GO
UPDATE MY_TABLE SET <a valid not null values for your column>
GO
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL
GO

एक अन्य विकल्प आपके कॉलम के लिए सही डिफ़ॉल्ट मान निर्दिष्ट करना है:

ALTER TABLE MY_TABLE ADD STAGE INT NOT NULL DEFAULT '0'

UPD: कृपया ध्यान दें कि ऊपर दिए गए उत्तर में वह है GOजो Microsoft SQL सर्वर पर इस कोड को चलाने पर होना चाहिए। यदि आप Oracle या MySQL पर एक ही ऑपरेशन करना चाहते हैं तो आपको सेमीकोलन का उपयोग करने की आवश्यकता ;है:

ALTER TABLE MY_TABLE ADD STAGE INT NULL;
UPDATE MY_TABLE SET <a valid not null values for your column>;
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL;

1
मैं व्यक्तिगत रूप से यहां पहला तरीका पसंद करता हूं यदि आपके पास मूल्य हैं जो आप फ़ील्ड में मैन्युअल रूप से डाल सकते हैं। इस तरह आपको एक डिफ़ॉल्ट बाधा को बनाने और हटाने के बारे में चिंता करने की ज़रूरत नहीं है जहाँ आपको किसी की आवश्यकता नहीं है।
मार्क डब्ल्यू डिक्सन

1
@acarlon - मुझे लगता है कि पहुंच रहा है। आपके द्वारा उल्लेखित खतरनाक updateकथन किसी भी प्रश्न में हानिकारक होगा। यह देखने के लिए पर्याप्त सरल होना चाहिए कि क्या आपके पास updateबयान में एक अतिरिक्त कॉलम है। आप आम तौर पर एक समय में केवल एक स्तंभ या दो जोड़ रहे होंगे। यदि आप अपने updateस्टेटमेंट में एक अतिरिक्त कॉलम जोड़ते हैं, जो इस उदाहरण में नहीं है, तो हो सकता है कि आप पहले स्थान पर डेटा के प्रभारी न हों।
मार्क डब्ल्यू डिक्सन

1
ANDROID डेवलपर्स SQLite का उपयोग करने के बारे में जानते हैं जो ALTER COLUMNSQLite में समर्थित नहीं है।
षड्गेशमी

2
मैंने पहले कभी नहीं देखा है GOऔर यह एसक्यूएल विनिर्देश का हिस्सा नहीं प्रतीत होता है , इस प्रकार यह संभवत: स्क्रिप्ट के लिए विफलता का कारण बन जाएगा जो इसे समर्थन करने वाले उपकरणों में से एक द्वारा निष्पादित नहीं किया जा सकता है। बस अर्धविराम का उपयोग करें? मैं Microsoft मानकों को फैलाने की अनुशंसा नहीं करता क्योंकि वे शायद ही किसी भी स्थापित और उचित मानक के बारे में परवाह करते हैं, लेकिन अपने स्वयं के आविष्कार करने के लिए अपने स्वयं के आविष्कार करते हैं। इसके अलावा, सहायक उत्तर।
नियॉनिट

2
@ टिप्पणी के लिए धन्यवाद, लेकिन मूल प्रश्न MS SQL सर्वर के बारे में था, यही कारण है कि GO है। लेकिन मैं अपने जवाब में इसके बारे में एक नोट जोड़ूंगा।
पावेल मोरशेन्युक सेप

13

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

ALTER TABLE dbo.YourTbl ADD
    newcol int NOT NULL CONSTRAINT DF_YourTbl_newcol DEFAULT 0

एंटरप्राइज एडिशन पर यह 2012 से केवल मेटाडेटा है


2
आपको इसकी आवश्यकता नहीं है, लेकिन यह एक विकल्प है।
मैट

6

त्रुटि संदेश काफी वर्णनात्मक है, कोशिश करें:

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';

और डिफ़ॉल्ट भाग में "माइनस" का क्या अर्थ है?
माल्डेन बी।

3

अन्य SQL कार्यान्वयन में समान प्रतिबंध हैं। इसका कारण यह है कि एक कॉलम को जोड़ने के लिए उस कॉलम के लिए मान जोड़ने की आवश्यकता होती है (तार्किक रूप से, भले ही शारीरिक रूप से नहीं), जो कि डिफ़ॉल्ट है NULL। यदि आप अनुमति नहीं देते हैं NULL, और आपके पास नहीं है default, तो मूल्य क्या होने वाला है?

चूँकि SQL Server समर्थन करता है ADD CONSTRAINT, मैं Pavel के एक अशक्त स्तंभ बनाने के दृष्टिकोण की सिफारिश करूँगा, और फिर NOT NULLइसे गैर- NULLमानों से भरने के बाद एक बाधा जोड़ना ।


MySQL डेटा के साथ मौजूदा तालिका में गैर-शून्य कॉलम जोड़ने का समर्थन करता है, जहां डेटा प्रकार के लिए "समझदार" खाली मान मौजूदा पंक्तियों (यानी नाव के लिए 0.0, पूर्णांक के लिए 0, स्ट्रिंग के लिए खाली स्ट्रिंग, आदि) में आपूर्ति की जाती है।
माइकल त्सांग

2

इसने मेरे लिए काम किया, डिजाइन दृश्य से "उधार" भी लिया जा सकता है, बदलाव करें -> राइट क्लिक -> परिवर्तन स्क्रिप्ट उत्पन्न करें।

BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
    YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.