मैं डेटा की नकल के बिना एक Oracle तालिका की एक प्रतिलिपि कैसे बना सकता हूं?


273

मैं बयान जानता हूं:

create table xyz_new as select * from xyz;

जो संरचना और डेटा की प्रतिलिपि बनाता है, लेकिन क्या होगा अगर मैं सिर्फ संरचना चाहता हूं?


जवाबों:


420

बस एक क्लॉज का उपयोग करें जो किसी भी पंक्तियों का चयन नहीं करेगा:

create table xyz_new as select * from xyz where 1=0;

सीमाएं

निम्नलिखित चीजों को नई तालिका में कॉपी नहीं किया जाएगा:

  • दृश्यों
  • ट्रिगर्स
  • अनुक्रमणिका
  • कुछ बाधाओं को कॉपी नहीं किया जा सकता है
  • भौतिकवादी दृश्य लॉग

यह विभाजन को भी नहीं संभालता है



53
यह एक महान, साफ जवाब है। बस यह याद दिलाना चाहते हैं कि इसमें कोई बाधा नहीं होगी .. नई तालिका में प्राथमिक कुंजी भी नहीं होगी।
जोसेफिसन

18
यह सीक्वेंस को दोहराएगा नहीं या ट्रिगर करेगा।
शाखागुबरील

16
न ही नई तालिका में कोई अनुक्रमणिका होगी - नई तालिका पर एक बड़ी क्वेरी करने की कोशिश में पकड़े न
जाएं

8
विभाजन को भी नहीं संभालता। लेकिन नमसते।
एम.के.

17
बस एक परिशिष्ट - इसमें कुछ अड़चनें होंगी - अर्थात किसी भी नाल की कमी की नकल नहीं की जाएगी।
जेफरी केम्प

84

मैंने उस पद्धति का उपयोग किया जिसे आपने बहुत कुछ स्वीकार किया, लेकिन जैसा कि किसी ने बताया कि यह डुप्लिकेट बाधाओं (नॉट नाउल को छोड़कर, मुझे नहीं लगता) के लिए है।

यदि आप पूर्ण संरचना की नकल करना चाहते हैं तो एक अधिक उन्नत विधि है:

SET LONG 5000
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME' ) FROM DUAL;

यह आपको पूर्ण बनाएँ कथन टेक्स्ट देगा जिसे आप नई तालिका बनाने के लिए इच्छानुसार संशोधित कर सकते हैं। आपको निश्चित रूप से तालिका के नाम और सभी बाधाओं को बदलना होगा।

(आप EXP / IMP का उपयोग करके पुराने संस्करणों में भी कर सकते हैं, लेकिन अब यह बहुत आसान है।)

जोड़ने के लिए संपादित यदि आपके बाद की तालिका अलग स्कीमा में है:

SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;

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

My_table_nameमौजूदा तालिका है। लेकिन मैं अपनी नई तालिका का नाम कैसे बनाऊं?
कुशाल्वम

मेरे जवाब में आदेश नई तालिका नहीं बनाता है; यह एसक्यूएल लौटाता है जिसका उपयोग आप मूल तालिका को फिर से बनाने के लिए करेंगे। आप इसे इच्छानुसार संशोधित करते हैं और फिर चलाते हैं। इसलिए नई तालिका का नाम वह है जो आप निर्दिष्ट करने के लिए चुनते हैं।
डेव कोस्टा

5
तो यह एक चर के लिए उपरोक्त एसक्यूएल आदेश सौंपने की तरह होना चाहिए। ryt? उदा। new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ). इस बीच कृपया मुझे बताएं कि LONG क्या करता है।
कुशाल्वम

15

Sql डेवलपर का उपयोग करके तालिका का चयन करें और DDL टैब पर क्लिक करें

जब आप इसे sql वर्कशीट में चलाते हैं, तो आप बिना डेटा वाली नई तालिका बनाने के लिए उस कोड का उपयोग कर सकते हैं

sqldeveloper ओरेकल से ऐप का उपयोग करने के लिए एक स्वतंत्र है।

यदि तालिका में क्रम है या ddl ट्रिगर है तो कभी-कभी आपके लिए भी उत्पन्न होगा। आपको बस सावधान रहना होगा कि आप उन्हें किस क्रम में बनाते हैं और जानते हैं कि ट्रिगर्स को चालू या बंद कब करना है।


ओरेकल SQL डेवलपर v.18.3 में टैब को कहा जाता हैSQL
मेटाफैनियल

14
create table xyz_new as select * from xyz where rownum = -1;

बार-बार पुनरावृति से बचने के लिए और उस स्थिति के आधार पर कुछ भी न डालें जहां 1 = 2 है


4
    DECLARE
    l_ddl   VARCHAR2 (32767);
BEGIN
    l_ddl      := REPLACE (
                      REPLACE (
                          DBMS_LOB.SUBSTR (DBMS_METADATA.get_ddl ('TABLE', 'ACTIVITY_LOG', 'OLDSCHEMA'))
                        , q'["OLDSCHEMA"]'
                        , q'["NEWSCHEMA"]'
                      )
                    , q'["OLDTABLSPACE"]'
                    , q'["NEWTABLESPACE"]'
                  );

    EXECUTE IMMEDIATE l_ddl;
END; 

3

आप ऐसा कर सकते हैं, Create table New_table as select * from Old_table where 1=2 ; लेकिन सावधान रहें कि आप जिस मेज पर खुराक बनाते हैं, उसमें कोई सूचकांक, पीके वगैरह नहीं है जैसे कि old_table


2
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

दूसरे के स्कीमा का उपयोग करके एक नई, खाली तालिका बनाएं। केवल WHERE क्लॉज जोड़ें जो क्वेरी को बिना डेटा वापस करने का कारण बनता है:


1

आप भी कर सकते हैं

create table abc_new as select * from abc; 

फिर टेबल को काटें abc_new। आशा है कि यह आपकी आवश्यकता को पूरा करेगा।


11
बेशक, यदि आपके पास मूल तालिका में बहुत सारे डेटा हैं, तो यह वास्तव में बहुत बुरा विचार हो सकता है। ;)
एलेक्सिस

1

बस एक प्रश्न लिखें:

create table new_table as select * from old_table where 1=2;

new_tableनई तालिका का नाम कहां है जिसे आप बनाना चाहते हैं और old_tableमौजूदा तालिका का नाम है जिसकी संरचना आप कॉपी करना चाहते हैं, यह संरचना को कॉपी करेगा।


1

WHERE 1 = 0या इसी तरह की गलत स्थितियां काम करती हैं, लेकिन मुझे नापसंद है कि वे कैसी दिखती हैं। Oracle 12c + IMHO के लिए मार्जिन क्लीनर कोड है

CREATE TABLE bar AS SELECT * FROM foo FETCH FIRST 0 ROWS ONLY;

समान सीमाएँ लागू होती हैं: केवल स्तंभ परिभाषाएँ और उनकी अशक्तता को एक नई तालिका में कॉपी किया जाता है।


1

दूसरे तरीके से आप नीचे सूचीबद्ध कमांड से टेबल निर्माण का डीडीएल प्राप्त कर सकते हैं, और निर्माण को निष्पादित कर सकते हैं।

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 
  • TYPEहै TABLE, PROCEDUREआदि

इस कमांड से आप डेटाबेस ऑब्जेक्ट से ddl का अधिकांश भाग प्राप्त कर सकते हैं।


ध्यान दें कि तर्क GET_DDLसंवेदनशील हैं।
श्रीधर सरनोबत


0

Pl / sql डेवलपर का उपयोग करके आप table_name पर या तो sql कार्यक्षेत्र या ऑब्जेक्ट एक्सप्लोरर में क्लिक कर सकते हैं, "व्यू" पर क्लिक करें और "view sql" पर क्लिक करें जो सभी बाधाओं के साथ टेबल बनाने के लिए sql स्क्रिप्ट उत्पन्न करता है। , सूचकांक, विभाजन आदि।

इसके बाद आप new_table_name का उपयोग करके स्क्रिप्ट चलाते हैं


0

टेबल डेटा के बिना कॉपी

create table <target_table> as select * from <source_table> where 1=2;

तालिका डेटा के साथ कॉपी करें

create table <target_table> as select * from <source_table>;

0
  1. तालिका xyz_new का चयन xyz से * के रूप में करें;

- यह टेबल बनाएगा और सभी डेटा को कॉपी करेगा।

  1. xyz_new से हटाएं;

- इसमें समान टेबल संरचना होगी लेकिन कॉपी किए गए सभी डेटा हटा दिए जाएंगे।

यदि आप उत्तर द्वारा निर्दिष्ट सीमाओं को पार करना चाहते हैं: तो मैं डेटा को कॉपी किए बिना ओरेकल तालिका की एक प्रतिलिपि कैसे बना सकता हूं?


-5

ऊपर दिए गए कार्य को दो सरल चरणों में पूरा किया जा सकता है।

चरण 1:

CREATE table new_table_name AS(Select * from old_table_name);

queryऊपर एक मेज का डुप्लिकेट (सामग्री के साथ साथ ही) पैदा करता है।

संरचना प्राप्त करने के लिए, तालिका का उपयोग करके सामग्री हटाएं।

चरण 2:

DELETE * FROM new_table_name.

आशा है इससे तुम्हारी समस्या का समाधान हो गया होगा। और पहले के पदों के लिए धन्यवाद। मुझे बहुत अंतर्दृष्टि दी।


13
यह truncateसंस्करण से भी कम कुशल है । सभी डेटा के लिए extents आवंटित करने के साथ-साथ, आप उन्हें हटाकर मुक्त नहीं कर रहे हैं, इसलिए आप संभावित रूप से अंतरिक्ष को बर्बाद कर रहे हैं जब तक कि तालिका पुराने आकार में नहीं बढ़ती। और आप डालने और हटाने दोनों पर पूर्ववत करें / फिर से कर रहे हैं। जिम का जवाब बहुत ही सरलता से दिया गया है।
एलेक्स पूले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.