डेटा खोए बिना SQL डेटाबेस में कॉलम डेटाटाइप को कैसे बदलें


198

मैं एसक्यूएल सर्वर डेटाबेस है और मैं सिर्फ एहसास हुआ कि मैं से स्तंभों में से एक का प्रकार बदल सकते हैं intकरने के लिए bool

मैं उस तालिका में पहले से दर्ज किए गए डेटा को खोए बिना कैसे कर सकता हूं?


3
क्या आपने एक नया बिट कॉलम बनाने की कोशिश की है, पुराने कॉलम से नए में मानों को कॉपी करते हुए, पुराने को हटाकर नया नाम बदल दिया है? लेन-देन में यह सब, ज़ाहिर है, समस्याओं पर रोलबैक करने के लिए।
रादू कैपरेस्कु

2
आप कहते हैं "मुझे बस एहसास हुआ कि मैं एक कॉलम से इंट से बूल तक बदल सकता हूं" कोई बूलियन डेटाटाइप नहीं है। हालांकि थोड़ा है। क्या आप पूछ रहे हैं कि आप ऐसा कैसे कर सकते हैं (जैसा कि अब तक के 2 उत्तर कवर किए गए हैं)। या आपका प्रश्न है "मुझे यह एहसास हुआ कि यह संभव है - SQL सर्वर यह कैसे करता है ?"
मार्टिन स्मिथ

जवाबों:


329

आप निम्न कमांड का उपयोग करके आसानी से कर सकते हैं। 0 का कोई भी मान 0 (BIT = false) में बदल जाएगा, और कुछ भी 1 (BIT = true) में बदल जाएगा।

ALTER TABLE dbo.YourTable
   ALTER COLUMN YourColumnName BIT

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


10
दूसरे शब्दों में: NULLरहता है NULL, 0बन जाता है False, गैर-शून्य मान (1, -1, 1999, -987 ...) बन जाता है True
अल्वारो गोंजालेज

2
और GUI से इस तरह का बदलाव कभी न करें। इसे हमेशा एक स्क्रिप्ट के माध्यम से इस तरह बनाते हैं। GUI ड्रॉप और तालिका को फिर से बनाएगा और इससे अधिक समय लगता है। यदि मेज बड़ी और उत्पादन पर है, तो यह विनाशकारी हो सकता है। साथ ही सभी तालिका परिवर्तनों में एक स्क्रिप्ट होनी चाहिए जो अन्य सभी कोड की तरह स्रोत नियंत्रण में हो।
HLGEM

1
मैं जोड़ूंगा, सुनिश्चित करें कि डेटा के साथ तालिका में कोई भी संरचनात्मक परिवर्तन करने से पहले आपके पास डेटाबेस का वर्तमान बैकअप है। और अगर तालिका अक्सर उपयोग की जाती है या बड़ी होती है तो पीक यूसेज घंटों के दौरान उत्पादन पर इस तरह से बदलाव न करें।
HLGEM

मैंने गलती से संपादनों को मंजूरी दे दी है ... अस्वीकार करने की आवश्यकता है .. क्योंकि वहां सुधार नहीं हुआ है ... उत्तर पूर्ण है।
विकाश पाठक


20

यदि यह एक वैध परिवर्तन है।

आप संपत्ति को बदल सकते हैं।

उपकरण -> विकल्प -> डिजाइनर -> तालिका और डेटाबेस डिजाइनर -> अनचेक -> बचत परिवर्तन को रोकते हैं जो आवश्यक तालिका पुन: निर्माण करते हैं।

अब आप आसानी से तालिका को फिर से बनाए बिना या यूआर रिकॉर्ड खोए स्तंभ नाम बदल सकते हैं।


5
किसी भी परिस्थिति में आपको GUI का उपयोग करके तालिका परिवर्तन नहीं करना चाहिए। यह पूरी तरह से तालिका का उपयोग करने के बजाय तालिका को फिर से बनाएगा और यह एक मुद्दा पैदा करेगा यदि आप इसे अनचेक करते हैं और तालिका बड़ी है। इसके अलावा आपको स्रोत नियंत्रण में स्क्रिप्ट में सभी परिवर्तन करने चाहिए।
HLGEM

उस विकल्प पर अधिक बारीकी से देखें - यह एक सुरक्षा को बंद कर रहा है जो GUI को तालिका को छोड़ने से रोक देगा। आप डेटा खोते नहीं दिखेंगे , क्योंकि GUI तालिका को फिर से बनाएगा, लेकिन सर्वर पर यह कॉपी / ड्रॉप होगा। इसलिए, यदि तालिका में बहुत अधिक डेटा है, तो यह एक बहुत बड़े ऑपरेशन का कारण होगा। इसके अलावा, मुझे लगता है कि (सकारात्मक नहीं) कि यह एक लेनदेन में होता है, इसलिए आप अपना लेनदेन लॉग भर सकते हैं।
JMarsch

1
मुझे लगता है कि मैं अपनी पिछली टिप्पणी में थोड़ा स्पष्टीकरण जोड़ना चाहूंगा। यदि आप अपनी विकास मशीन पर ऐसा कर रहे हैं, तो आप शायद ठीक हैं। लेकिन मैं उत्पादन विधि पर इस पद्धति का उपयोग करने की सलाह नहीं दूंगा - खासकर अगर यह एक मिशन महत्वपूर्ण है।
JMarsch

8

आपको क्यों लगता है कि आप डेटा खो देंगे? बस प्रबंधन स्टूडियो में जाएं और डेटा प्रकार बदलें। यदि मौजूदा मूल्य को बूल (बिट) में परिवर्तित किया जा सकता है, तो वह ऐसा करेगा। दूसरे शब्दों में, यदि आपके मूल क्षेत्र में झूठे "1" नक्शे सही और "0" नक्शे हैं, तो आप ठीक हो जाएंगे।


1
यदि आपके पास तालिका में डेटा है तो यह काम नहीं करेगा। जब आप एक स्तंभ प्रकार को बदलने का प्रयास करते हैं, तो एसएमएस दावा करता है कि उसे पहले तालिका को छोड़ने की आवश्यकता है ... जो कि निश्चित रूप से गलत है क्योंकि ... गैर-फ़ील्ड के लिए भी ALTER COLUMN कमांड ठीक काम करती है। यही कारण है कि उन्हें लगा कि वे डेटा को ढीला कर सकते हैं।
टोनी ओ'हागन

1
@ टोनीओहगन यह सच नहीं है। आप चेतावनी को बंद कर सकते हैं और यह मौजूदा डेटा के साथ ठीक काम करेगा। यह भी देखें stackoverflow.com/questions/2947865/…
फिलिप लेबेर्ट

1
अच्छा ठीक है! नहीं पता था कि बस आपको (पीछे) वोट देने की कोशिश की गई लेकिन एसओ मुझे रोक रहा है जब तक कि आप अपना जवाब संपादित नहीं करते। शायद एक मामूली बदलाव और मैं ऐसा कर सकता हूं;)।
टोनी ओ'हागन

1
किसी भी परिस्थिति में आपको GUI का उपयोग करके तालिका परिवर्तन नहीं करना चाहिए। यह पूरी तरह से तालिका का उपयोग करने के बजाय तालिका को फिर से बनाएगा और यह एक मुद्दा पैदा करेगा यदि आप इसे अनचेक करते हैं और तालिका बड़ी है। इसके अलावा आपको स्रोत नियंत्रण में स्क्रिप्ट में सभी परिवर्तन करने चाहिए।
HLGEM

किसी भी परिस्थिति में। कोई कारण नहीं है कि जीयूआई का उपयोग टेबल डिजाइन करने के लिए या उन्हें बदलने के लिए और अच्छे कारणों से नहीं करें। सभी परिवर्तनों को स्क्रिप्ट में होना चाहिए ताकि वे अन्य सर्वरों को प्रचारित करने में सक्षम हों और उस कोड की तरह व्यवहार करें जो वे वास्तव में स्रोत नियंत्रण में हैं।
HLGEM

5

यदि आप T-SQL (MSSQL) का उपयोग करते हैं; आपको इस स्क्रिप्ट को आज़माना चाहिए:

ALTER TABLE [Employee] ALTER COLUMN [Salary] NUMERIC(22,5)

यदि आप MySQL का उपयोग करते हैं; आपको इस स्क्रिप्ट को आज़माना चाहिए:

ALTER TABLE [Employee] MODIFY COLUMN [Salary] NUMERIC(22,5)

यदि आप Oracle का उपयोग करते हैं; आपको इस स्क्रिप्ट को आज़माना चाहिए:

ALTER TABLE [Employee] MODIFY [Salary] NUMERIC(22,5)

3

टूल-ऑप्शन-डिज़ाइनर-टेबल और डेटाबेस डिज़ाइनर पर जाएँ और सेविंग ऑप्शन को अनचेक करेंयहां छवि विवरण दर्ज करें


1
किसी भी परिस्थिति में आपको GUI का उपयोग करके तालिका परिवर्तन नहीं करना चाहिए। यह पूरी तरह से तालिका का उपयोग करने के बजाय तालिका को फिर से बनाएगा और यह एक मुद्दा पैदा करेगा यदि आप इसे अनचेक करते हैं और तालिका बड़ी है। इसके अलावा आपको स्रोत नियंत्रण में स्क्रिप्ट में सभी परिवर्तन करने चाहिए।
HLGEM

2

कॉलम के चेक प्रकार के साथ अलर्ट कॉलम डेटा प्रकार:

IF EXISTS(
       SELECT 1
       FROM   sys.columns
       WHERE  NAME = 'YourColumnName'
              AND [object_id] = OBJECT_ID('dbo.YourTable')
              AND TYPE_NAME(system_type_id) = 'int'
   )
    ALTER TABLE dbo.YourTable ALTER COLUMN YourColumnName BIT

1

मेरे लिए, sql सर्वर 2016 में, मैं इसे इस तरह से करता हूं

* कॉलम कॉलम 1 से कॉलम 2 का नाम बदलना

EXEC sp_rename 'dbo.T_Table1.Column1', 'Column2', 'COLUMN'

* कॉलम को स्ट्रिंग से int में संशोधित करने के लिए :( कृपया सुनिश्चित करें कि डेटा सही प्रारूप में हैं )

ALTER TABLE dbo.T_Table1 ALTER COLUMN Column2  int; 

0

कॉम्पैक्ट संस्करण में डेटाटाइम के प्रकार (8) के लिए स्वचालित रूप से आकार लेगा, इसलिए फ़ील्ड का आकार सेट करने और इस ऑपरेशन के लिए त्रुटि उत्पन्न करने की कोई आवश्यकता नहीं है ...


-2

मैं इन निम्नलिखित क्वेरी के साथ तालिका क्षेत्र के डेटाटाइप को संशोधित कर सकता हूं: और Oracle DB में भी,

ALTER TABLE table_name
MODIFY column_name datatype;

एसक्यूएल सर्वर में नहीं
HLGEM

-4

डेटा खोए बिना डेटाटाइप को बदलें

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