एक कॉलम को बदलना: अशक्त नहीं करने के लिए अशक्त


1216

मेरे पास एक तालिका है जिसमें कई अशक्त पूर्णांक स्तंभ हैं। यह कई कारणों से अवांछनीय है, इसलिए मैं सभी नल को 0 पर अपडेट करना चाह रहा हूं और फिर इन कॉलमों को सेट करना चाहता हूं NOT NULL। नल को बदलने के अलावा 0, डेटा संरक्षित किया जाना चाहिए।

मैं एक कॉलम (इसे कॉल करें ) को " " में बदलने के लिए विशिष्ट SQL सिंटैक्स की तलाश कर रहा हूं । मान लें कि डेटा में नल नहीं होने के लिए अपडेट किया गया है।ColumnAnot null

SQL सर्वर 2000 का उपयोग करना ।


16
एक अन्य बात - आप उस डिफ़ॉल्ट को जोड़ना चाहते हैं जो किसी भी मौजूदा आवेषण को निर्दिष्ट करता है जो स्तंभ को विफल नहीं करता है: ALTER TABLE FOO ADD CONSTRAINT FOO_Bar_Default DEFAULT 0 for Bar
Marc Gravell

4
आपको यह जानकर भी आश्चर्य हो सकता है कि कुछ परिस्थितियों में एक कॉलम को बदलने से NOT NULLबहुत अधिक लॉगिंग हो सकती है।
मार्टिन स्मिथ

जवाबों:


2011

सबसे पहले, सभी वर्तमान NULLमानों को गायब कर दें:

UPDATE [Table] SET [Column]=0 WHERE [Column] IS NULL

फिर, "NULLs" को हटाने के लिए तालिका परिभाषा को अपडेट करें:

ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL

49
मुझे उपरोक्त दो सही प्रतिक्रियाओं के लिए मूल्य-जोड़ दें। NULL के शब्दार्थ के कुछ अर्थ हो सकते हैं। सामान्य अर्थ में से एक UNKNOWN है। उदाहरण के तौर पर SCORE लें। एक शून्य स्कोर और एक शून्य स्कोर अंतर की एक दुनिया है! इससे पहले कि आप ऊपर की सिफारिशें करते। सुनिश्चित करें कि आप आवेदन अपने व्यावसायिक तर्क में शून्य नहीं लेते हैं।
TechTravelThink

242
यदि आप एक टाइपो बनाते हैं और आपका DB विस्फोट होता है, तो पहले अपने डेटाबेस का बैकअप लें।
मपेन सेप

20
इसका अजीब एमएस एसक्यूएल मैनेजमेंट स्टूडियो उस विकल्प की अनुमति नहीं देता है, यह "ड्रॉपिंग टेबल ..." के बारे में डींग मारता है
सेबस्टियन

14
डेटाबेस हमेशा बैकअप होना चाहिए। आप कभी नहीं जानते कि आपका कोई व्यक्ति कब लिख सकता है और अपडेट या डिलीट कर सकता है और WHERE क्लॉज भूल सकता है।
विवियन रिवर

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

57

मुझे भी यही समस्या थी, लेकिन फ़ील्ड को शून्य करने के लिए डिफ़ॉल्ट रूप से उपयोग किया जाता था, और अब मैं इसे डिफ़ॉल्ट रूप से 0. करना चाहता हूं। mdb के समाधान के बाद एक और लाइन जोड़ने की आवश्यकता है:

ALTER TABLE [Table] ADD CONSTRAINT [Constraint] DEFAULT 0 FOR [Column];

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

6
क्या आपने "एक और पंक्ति जोड़ने" के बारे में भाग पढ़ा था? जैसा कि, यह उपरोक्त उत्तर के अतिरिक्त है?
ग्रेग डौबर्टी

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

2
बस इसमें झंकार करना चाहता था और कहना चाहता था कि यह स्पष्ट रूप से आपके बाधाओं को स्पष्ट रूप से नाम देने के लिए एक अच्छा विचार है। यदि आपको कभी एक कॉलम को छोड़ने की आवश्यकता होती है, तो आपको इससे पहले कि आप कर पाएंगे, आपको छोड़ने के लिए बाधा का नाम जानना होगा। हमारे DB में इस में भाग कुछ समय पलायन। मुझे पता है कि उदाहरण में इसे शामिल किया गया है, लेकिन यह अभी भी एक जगह है जहां कुछ देव यात्रा करते हैं क्योंकि नाम की आवश्यकता नहीं है।
२२

38

आपको इसे दो चरणों में करना होगा:

  1. तालिका को अपडेट करें ताकि कॉलम में कोई नल न हो।
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
  1. स्तंभ की संपत्ति को बदलने के लिए तालिका को बदल दें
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL

27

Oracle 11g के लिए, मैं स्तंभ विशेषता को निम्नानुसार बदल सकता था:

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

अन्यथा अबेटीव का जवाब अच्छा लग रहा था। आप परिवर्तन को दोहरा नहीं सकते - यह शिकायत करता है (कम से कम SQL डेवलपर में) कि स्तंभ पहले से ही अशक्त नहीं है।


ऐसा लगता है कि Oracle 11 में, आपको दोहराना नहीं है datatype। केवल columname NOT NULLपर्याप्त है। दस्तावेज देखें ।
jpmc26


16

जब तक कॉलम एक अद्वितीय पहचानकर्ता नहीं है

UPDATE table set columnName = 0 where columnName is null

फिर

तालिका को बदल दें और फ़ील्ड को गैर शून्य में सेट करें और 0 का डिफ़ॉल्ट मान निर्दिष्ट करें


4

यह सरल लगता है, लेकिन केवल ओरेकल पर काम करता है:

ALTER TABLE [Table] 
ALTER [Column] NUMBER DEFAULT 0 NOT NULL;

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


हां, लेकिन Google यहां लोगों को निर्देशित करता है .. इसने बहुत सारे उत्थान का कारण बना, और बहुत सारे डाउनवोट्स। मुझे लगता है कि यह उपयोगी है। हर कोई इसे अनदेखा करने के लिए स्वतंत्र है, लेकिन मैं ईमानदारी से सोचता हूं और देखता हूं कि यह लोगों की मदद कर रहा है।
csomakk

कृपया, SO नियम पढ़ें। मैं एक अच्छा जवाब कैसे लिखूं? , तकनीकी तकनीकी सहायता पूरी तरह से और सही प्रश्न लिखें । नोट: बेकार जवाबों को हटाने (या जोरदार तरीके से संपादित करने) से न डरें और न ही
Kiquenet

4

के मामले में FOREIGN KEY CONSTRAINT... प्राथमिक कुंजी तालिका के कॉलम में '0' मौजूद नहीं होने पर समस्या होगी। उस के लिए समाधान है ...

चरण 1:

इस कोड का उपयोग कर सभी बाधाओं को अक्षम करें:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

चरण 2:

RUN UPDATE COMMAND (as mentioned in above comments)
RUN ALTER COMMAND (as mentioned in above comments)

चरण 3:

इस कोड का उपयोग करके सभी बाधाओं को सक्षम करें:

exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

4

मेरे मामले में मुझे पोस्ट किए गए उत्तरों के साथ कठिनाइयाँ थीं। मैंने निम्नलिखित का उपयोग करके समाप्त किया:

ALTER TABLE table_name CHANGE COLUMN column_name column_name VARCHAR(200) NOT NULL DEFAULT '';

बदले VARCHAR(200)अपने डेटाप्रकार के लिए, और वैकल्पिक डिफ़ॉल्ट मान बदल जाते हैं।

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


1

आइए एक उदाहरण लेते हैं:

TABLE NAME=EMPLOYEE

और मैं कॉलम EMPLOYEE_NAMEको बदलना चाहता हूं NOT NULL। इस क्वेरी का उपयोग कार्य के लिए किया जा सकता है:

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;

कृपया पोस्ट को अधिक पठनीय बनाने के बजाय उसे स्वरूपित न करें। उदाहरण के लिए कोड भाग को पहचानने में मदद करता है। stackoverflow.com/editing-help
युनानोश

इसके अलावा, कृपया सभी-कैप्स में लंबा टेक्स्ट न लिखें। यह इंटरनेट पर चिल्लाते हुए माना जाता है
ज़ो

1
@PawanTiwari कृपया पूर्ण संपादन करें। आपको पोस्ट के सभी मुद्दे ठीक नहीं लगे। इसमें से अधिकांश पूंजीकृत है।
डबल-बीप

@ डबल-बीप, ज़रूर मैं इसे ध्यान में रखूंगा। धन्यवाद
पवन तिवारी

स्वरूपण के मुद्दों के अलावा, कृपया और अधिक स्पष्ट करें कि आपका उत्तर क्या अतिरिक्त जानकारी प्रदान करता है, जैसे कि राल्फ विगगम, जेडीएम, रश्मि सिंह और ट्रूपर 31 द्वारा पुराने उत्तरों की तुलना में, जो पहली नज़र में कार्यात्मक रूप से समान लगते हैं। ऐसा लगता है कि आपके समाधान की बारीकियों को इंगित करना आवश्यक है। सिर्फ नकल के जवाबों की छाप से बचने की कोशिश करें ...
युन्नोस्क

0

JDK में शामिल इनबिल्ट javaDB (Apache Derby का Oracle समर्थित वितरण) के लिए, नीचे ने मेरे लिए काम किया

alter table [table name] alter column [column name] not null;

0

कॉलम को अशक्त नहीं बनाना और डिफ़ॉल्ट जोड़ना भी SSMS GUI में किया जा सकता है।

  1. जैसा कि अन्य लोग पहले ही बता चुके हैं, आप तब तक "शून्य नहीं" सेट नहीं कर सकते, जब तक कि सभी मौजूदा डेटा "शून्य नहीं" हों, जैसे:

UPDATE myTable SET myColumn = 0

  1. एक बार ऐसा हो जाने के बाद, टेबल इन डिज़ाइन व्यू (टेबल पर राइट क्लिक करें और "डिज़ाइन व्यू" पर क्लिक करें), आप बस Nulls कॉलम को इस तरह से अनचेक कर सकते हैं :

यहां छवि विवरण दर्ज करें

  1. अभी भी चयनित कॉलम के साथ डिज़ाइन दृश्य में, आप नीचे विंडो में कॉलम गुण देख सकते हैं और डिफ़ॉल्ट को 0 में सेट कर सकते हैं जैसे कि नीचे दिया गया है:

यहां छवि विवरण दर्ज करें


मैं नीचे देख रहा हूँ, लेकिन मैं प्रतिक्रिया के बिना कुछ भी सही नहीं कर सकता। कृपया मुझे बताएं अगर कुछ काम नहीं किया।
टोनी एल।

-1

आप निम्नलिखित sql का उपयोग करके मौजूदा DB कॉलम की परिभाषा को बदल सकते हैं।

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