2011-03-22 15 views
18

मेरे पास एक विशिष्ट परिदृश्य है जहां मुझे ओरेकल में मौजूदा तालिका में दो नए कॉलम डालना होगा। मैं टेबल छोड़ने और पुनर्निर्माण नहीं कर सकता। तो क्या इसे किसी भी माध्यम से हासिल किया जा सकता है ??तालिका छोड़ने और पुनर्निर्माण के बिना ऑरैकल में किसी विशिष्ट स्थिति में कॉलम कैसे सम्मिलित करें?

+4

12 सी में ऐसा करने के लिए एक चाल है: http://tkyte.blogspot.com.au/2013/07/12c-silly-little-trick-with-invisibility.html (नोट, हालांकि, कोई नहीं है कॉलम ऑर्डर बदलने के लिए तार्किक कारण।) –

+0

क्या आप उन स्तंभों को जोड़ना नहीं चाहते हैं जो अंतरिक्ष को बचाने के लिए तालिका के अंत में शून्य होने की संभावना रखते हैं? Https://community.oracle.com/thread/855964 देखें –

उत्तर

15

Amit-

मैं तुम्हें कहीं भी लेकिन तालिका के अंत में एक स्तंभ जोड़ सकते हैं एक बार तालिका बनने विश्वास नहीं है।

CREATE TABLE MY_TEMP_TABLE AS 
SELECT * 
FROM TABLE_TO_CHANGE; 

तालिका आप करने के लिए कॉलम जोड़ना चाहते हैं ड्रॉप: एक समाधान यह कोशिश करने के लिए हो सकता है

DROP TABLE TABLE_TO_CHANGE; 

यह बात आप स्तंभों में जोड़ने खरोंच से मौजूदा तालिका के पुनर्निर्माण सकता है जहाँ आप तमन्ना। आइए इस अभ्यास के लिए मान लें कि आप "COL2 और COL3" नामक कॉलम जोड़ना चाहते हैं।

अब नई तालिका में वापस डेटा सम्मिलित करें:

INSERT INTO TABLE_TO_CHANGE (COL1, COL2, COL3, COL4) 
SELECT COL1, 'Foo', 'Bar', COL4 
FROM MY_TEMP_TABLE; 

डेटा अपने "नए-पुराने" तालिका में सम्मिलित किया जाता है, आप अस्थायी तालिका छोड़ सकते हैं।

DROP TABLE MY_TEMP_TABLE; 

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

-CJ

5

आप (अभी भी) स्तंभ ALTER तालिका का उपयोग कर की स्थिति नहीं चुन सकते हैं: यह केवल तालिका के अंत में जोड़ा जा सकता है। आप स्पष्ट रूप से किसी भी क्रम में कॉलम का चयन कर सकते हैं, इसलिए जब तक आप कॉलम ऑर्डर से चयन * का उपयोग नहीं कर रहे हैं, तो यह एक बड़ा सौदा नहीं होना चाहिए।

तुम सच में एक विशेष क्रम में उन्हें होना चाहिए और ड्रॉप और टेबल को पुनः नहीं कर सकता है, तो आप के बजाय छोड़ और कॉलम बनाने में सक्षम हो सकता है: -

पहली प्रति तालिका

CREATE TABLE my_tab_temp AS SELECT * FROM my_tab; 

फिर कॉलम है कि आप स्तंभ के बाद होना चाहते हैं ड्रॉप आप सम्मिलित होगा

ALTER TABLE my_tab DROP COLUMN three; 

अब नया स्तंभ (इस उदाहरण में दो) और जिन्हें आप हटा दिया जोड़ें।

ALTER TABLE my_tab ADD (two NUMBER(2), three NUMBER(10)); 

अन्त में फिर से बनाया कॉलम

UPDATE my_tab SET my_tab.three = (SELECT my_tab_temp.three FROM my_tab_temp WHERE my_tab.one = my_tab_temp.one); 

जाहिर है अपने अद्यतन सबसे अधिक संभावना अधिक जटिल हो जाएगा और आप अनुक्रमित और बाधाओं को संभालने के लिए होगा और नहीं कर सकेंगे के लिए डेटा वापस जोड़ने कुछ मामलों में इसका उपयोग करने के लिए (LOB कॉलम आदि)। इसके अलावा यह करने के लिए यह एक बहुत ही भयंकर तरीका है - लेकिन तालिका हमेशा मौजूद रहेगी और आप इच्छित क्रम में कॉलम के साथ समाप्त हो जाएंगे। लेकिन कॉलम ऑर्डर वास्तव में इतना मायने रखता है?

4

हालांकि यह कुछ हद तक पुराना है, मैं थोड़ा बेहतर संस्करण जोड़ना चाहता हूं जो वास्तव में कॉलम ऑर्डर बदलता है।अस्थायी करने

alter table TAB1 add (NEW_COL number);
  1. "कॉपी" तालिका:

    1. तालिका tab1 करने के लिए नए स्तंभ जोड़ें: ये कदम उठाएँ (यह मानते हुए कि हम एक मेज के साथ कॉलम Col1, col2, COL3 tab1 है) जबकि स्तंभ आदेश को बदलने नाम और नया स्तंभ का नाम बदलने:
    create table tempTAB1 as select NEW_COL as COL0, COL1, COL2, COL3 from TAB1;
    1. ड्रॉप मौजूदा तालिका:
    rename tempTAB1 to TAB1;
-10

बस इस तरह कार्य करें::

drop table TAB1;
  1. नाम बदलने अस्थायी tablename सिर्फ tablename गिरा दिया करने के लिए

    alter table TABLE_NAME (COLUMN_NAME  DATA_TYPE); 
    

    एक नया स्तंभ होगा तालिका के अंत में जोड़ा जाना चाहिए।

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

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