2011-12-12 7 views
32

किसी तालिका में एक कॉलम में सिसडेट का डिफ़ॉल्ट मान होता है और मैं इसे बदलना चाहता हूं इसलिए इसे कोई डिफ़ॉल्ट मान नहीं मिलता है, मैं यह कैसे कर सकता हूं?मैं ओरेकल में कॉलम से डिफ़ॉल्ट मान कैसे हटा सकता हूं?

उत्तर

30
ALTER TABLE YourTable MODIFY YourColumn DEFAULT NULL; 
+22

यह पूरी तरह से सच नहीं है। आप उस डिफ़ॉल्ट मान को नहीं हटाते जिसे आपने इसे 'NULL' पर सेट किया है। डिफ़ॉल्ट मान को हटाया नहीं जा सकता है, ओरेकल दस्तावेज़ों का कहना है: "यदि किसी कॉलम का डिफ़ॉल्ट मान होता है, तो आप डिफ़ॉल्ट को NULL में बदलने के लिए DEFAULT क्लॉज का उपयोग कर सकते हैं, लेकिन आप डिफ़ॉल्ट मान को पूरी तरह से हटा नहीं सकते हैं। यानी, यदि कोई कॉलम है कभी भी इसे डिफ़ॉल्ट मान दिया गया था, तो USER_TAB_COLUMNS डेटा डिक्शनरी व्यू का DATA_DEFAULT कॉलम हमेशा डिफ़ॉल्ट मान या NULL प्रदर्शित करेगा। " –

+5

@ माइकल-ओ क्या वह कार्यात्मक रूप से बराबर है जब कोई 'डिफॉल्ट' नहीं है? (यदि ऐसा है, तो किसी को आश्चर्य करना होगा कि वे इसे लगातार क्यों नहीं बनाते हैं और आंतरिक रूप से सबकुछ डिफ़ॉल्ट रूप से 'NULL' का 'डिफॉल्ट' देते हैं। अंतिम उपयोगकर्ता के रूप में, मुझे आंतरिक विवरणों की परवाह नहीं करनी चाहिए ।) – jpmc26

+4

@ jpmc26, आप सही हैं कि वे * कार्यात्मक रूप से * समकक्ष हैं।हालांकि, वहाँ मामलों में जहां [यह डेटाबेस आत्मनिरीक्षण के उत्पादन को प्रभावित करता है, के रूप में मैं अपने जवाब में लिखा था] कर रहे हैं (http://stackoverflow.com/a/37265135/20789)। (यह कई बेवकूफ कोने मामलों है कि मुझे नेतृत्व समाप्त करने के लिए कि Oracle एक अत्यंत प्रोग्रामर-अमित्र डेटाबेस है में से एक है।) –

4

जो भी आप चाहते हैं उसे करने का एकमात्र तरीका तालिका को फिर से बनाना है।

टॉड में करना बहुत आसान है, बस तालिका पर राइट क्लिक करें और "पुनर्निर्माण तालिका" का चयन करें। टोड स्क्रिप्ट तैयार करेगा जो तालिका का नाम बदल देगा और एक नई तालिका को फिर से बनाएगा। लिपि इंडेक्स, बाधाओं, विदेशी कुंजी, टिप्पणियां इत्यादि को फिर से बनाएगी ... और डेटा के साथ तालिका को पॉप्युलेट करेगा।

प्रश्न में कॉलम के बाद बस "डिफ़ॉल्ट शून्य" को हटाने के लिए स्क्रिप्ट को संशोधित करें।

+1

एक स्तंभ ड्रॉप कर सकते हैं और उसे फिर से जोड़ना। 'वैकल्पिक तालिका mytable ड्रॉप कॉलम mycolumn; ALTER तालिका mytable जोड़ें MyColumn तिथि; ' –

+1

यह है काम करते हैं, केवल मुद्दा यह है कि यह स्तंभ सूची में नीचे ले स्तंभ पर आ जाएगा है। यदि आप कॉलम ऑर्डर को संरक्षित करना चाहते हैं, तो तालिका को छोड़ें और फिर से बनाएं। –

7

Joe's answer इस अर्थ में कि DEFAULT NULL के साथ एक स्तंभ है में सही है कार्यात्मक पहली जगह में उस स्तंभ के लिए कोई डिफ़ॉल्ट मान परिभाषित कभी नहीं होने के बराबर: एक कॉलम कोई डिफ़ॉल्ट मान है, तो एक निर्दिष्ट किए बिना एक नई पंक्ति डालने उस कॉलम के लिए मान NULL में परिणाम।

हालांकि, ओरेकल आंतरिक रूप से दो मामलों साफ़, का प्रतिनिधित्व करता है के रूप में ALL_TAB_COLUMNS system view को देखकर देखा जा सकता है *

  1. मामले में जहां एक स्तंभ बना दिया गया है, या ALTER एड, DEFAULT NULL साथ।:

    create table foo (bar varchar2(3) default null); 
    
    select default_length, data_default from all_tab_columns where table_name='FOO'; 
    
    => default_length data_default 
        -------------- ------------ 
        4     NULL 
    
    select dbms_metadata.get_ddl('TABLE','FOO') from dual; 
    
    => CREATE TABLE "FOO" 
        ( "BAR" VARCHAR(3) DEFAULT NULL 
         … 
        ) 
    
  2. कोई डिफ़ॉल्ट कभी निर्दिष्ट:

    create table foo (bar varchar2(3)); 
    
    select default_length, data_default from all_tab_columns where table_name='FOO'; 
    
    => default_length data_default 
        -------------- ------------ 
        (null)   (null) 
    
    select dbms_metadata.get_ddl('TABLE','FOO') from dual; 
    
    => CREATE TABLE "FOO" 
        ( "BAR" VARCHAR(3) 
         … 
        ) 
    

जैसा कि ऊपर दिखाया गया है, वहाँ एक महत्वपूर्ण मामले में जहां यह व्यर्थ भेद Oracle की उत्पादन में एक फर्क नहीं पड़ता है: जब DBMS_METADATA.GET_DDL() का उपयोग कर तालिका परिभाषा को निकालने के लिए।

यदि आप अपने डेटाबेस का निरीक्षण करने के लिए GET_DDL() का उपयोग कर रहे हैं, तो आपको कार्यात्मक रूप से समान तालिकाओं के लिए थोड़ा अलग डीडीएल आउटपुट मिलेगा।

यह अन्य वास्तव में काफी कष्टप्रद है जब संस्करण नियंत्रण और एक डेटाबेस के कई उदाहरण के बीच तुलना के लिए GET_DDL() उपयोग कर, और कोई रास्ता नहीं यह से बचने के लिए है, की तुलना में मैन्युअल GET_DDL() के उत्पादन में संशोधित करने के लिए, या पूरी तरह से मेज से बनाना कोई डिफ़ॉल्ट मान नहीं है।

* कम से कम ओरेकल 10 जी, 11 जी और 12 सी के लिए।

+0

मैं ड्रोप डेफॉल्ट पर एक नज़र डालेगा; मुझे नहीं पता कि यह डिफ़ॉल्ट शून्य के बराबर है लेकिन अधिक विशिष्ट लगता है। –

+0

ओरेकल 12 के रूप में, इसमें कोई 'ड्रोप डिफॉल्ट' नहीं है। यह वास्तव में समस्या है और यही कारण है कि हमें 'डेफुल न्यूल' के साथ इसके आसपास काम करने की आवश्यकता है। (है कि आप oracle.com पर मिल 'ड्रॉप DEFAULT' के लिए कोई संदर्भ संभावना MySQL से जुड़े हुए हैं ... जो एक पूरी तरह से अलग डाटाबेस अब ओरेकल के स्वामित्व में है।) –

संबंधित मुद्दे