जवाबों:
बस एक क्लॉज का उपयोग करें जो किसी भी पंक्तियों का चयन नहीं करेगा:
create table xyz_new as select * from xyz where 1=0;
निम्नलिखित चीजों को नई तालिका में कॉपी नहीं किया जाएगा:
यह विभाजन को भी नहीं संभालता है
मैंने उस पद्धति का उपयोग किया जिसे आपने बहुत कुछ स्वीकार किया, लेकिन जैसा कि किसी ने बताया कि यह डुप्लिकेट बाधाओं (नॉट नाउल को छोड़कर, मुझे नहीं लगता) के लिए है।
यदि आप पूर्ण संरचना की नकल करना चाहते हैं तो एक अधिक उन्नत विधि है:
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
मौजूदा तालिका है। लेकिन मैं अपनी नई तालिका का नाम कैसे बनाऊं?
new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ).
इस बीच कृपया मुझे बताएं कि LONG क्या करता है।
Sql डेवलपर का उपयोग करके तालिका का चयन करें और DDL टैब पर क्लिक करें
जब आप इसे sql वर्कशीट में चलाते हैं, तो आप बिना डेटा वाली नई तालिका बनाने के लिए उस कोड का उपयोग कर सकते हैं
sqldeveloper ओरेकल से ऐप का उपयोग करने के लिए एक स्वतंत्र है।
यदि तालिका में क्रम है या ddl ट्रिगर है तो कभी-कभी आपके लिए भी उत्पन्न होगा। आपको बस सावधान रहना होगा कि आप उन्हें किस क्रम में बनाते हैं और जानते हैं कि ट्रिगर्स को चालू या बंद कब करना है।
SQL
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;
आप ऐसा कर सकते हैं,
Create table New_table as
select * from Old_table where 1=2 ;
लेकिन सावधान रहें
कि आप जिस मेज पर खुराक बनाते हैं, उसमें कोई सूचकांक, पीके वगैरह नहीं है जैसे कि old_table
बस एक प्रश्न लिखें:
create table new_table as select * from old_table where 1=2;
new_table
नई तालिका का नाम कहां है जिसे आप बनाना चाहते हैं और old_table
मौजूदा तालिका का नाम है जिसकी संरचना आप कॉपी करना चाहते हैं, यह संरचना को कॉपी करेगा।
WHERE 1 = 0
या इसी तरह की गलत स्थितियां काम करती हैं, लेकिन मुझे नापसंद है कि वे कैसी दिखती हैं। Oracle 12c + IMHO के लिए मार्जिन क्लीनर कोड है
CREATE TABLE bar AS
SELECT *
FROM foo
FETCH FIRST 0 ROWS ONLY;
समान सीमाएँ लागू होती हैं: केवल स्तंभ परिभाषाएँ और उनकी अशक्तता को एक नई तालिका में कॉपी किया जाता है।
दूसरे तरीके से आप नीचे सूचीबद्ध कमांड से टेबल निर्माण का डीडीएल प्राप्त कर सकते हैं, और निर्माण को निष्पादित कर सकते हैं।
SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL
TYPE
है TABLE
, PROCEDURE
आदिइस कमांड से आप डेटाबेस ऑब्जेक्ट से ddl का अधिकांश भाग प्राप्त कर सकते हैं।
GET_DDL
संवेदनशील हैं।
Create table target_table
As
Select *
from source_table
where 1=2;
Source_table तालिका यू की संरचना की प्रतिलिपि बनाना चाहते हैं।
Pl / sql डेवलपर का उपयोग करके आप table_name पर या तो sql कार्यक्षेत्र या ऑब्जेक्ट एक्सप्लोरर में क्लिक कर सकते हैं, "व्यू" पर क्लिक करें और "view sql" पर क्लिक करें जो सभी बाधाओं के साथ टेबल बनाने के लिए sql स्क्रिप्ट उत्पन्न करता है। , सूचकांक, विभाजन आदि।
इसके बाद आप new_table_name का उपयोग करके स्क्रिप्ट चलाते हैं
- तालिका xyz_new का चयन xyz से * के रूप में करें;
- यह टेबल बनाएगा और सभी डेटा को कॉपी करेगा।
- xyz_new से हटाएं;
- इसमें समान टेबल संरचना होगी लेकिन कॉपी किए गए सभी डेटा हटा दिए जाएंगे।
यदि आप उत्तर द्वारा निर्दिष्ट सीमाओं को पार करना चाहते हैं: तो मैं डेटा को कॉपी किए बिना ओरेकल तालिका की एक प्रतिलिपि कैसे बना सकता हूं?
ऊपर दिए गए कार्य को दो सरल चरणों में पूरा किया जा सकता है।
CREATE table new_table_name AS(Select * from old_table_name);
query
ऊपर एक मेज का डुप्लिकेट (सामग्री के साथ साथ ही) पैदा करता है।
संरचना प्राप्त करने के लिए, तालिका का उपयोग करके सामग्री हटाएं।
DELETE * FROM new_table_name.
आशा है इससे तुम्हारी समस्या का समाधान हो गया होगा। और पहले के पदों के लिए धन्यवाद। मुझे बहुत अंतर्दृष्टि दी।
truncate
संस्करण से भी कम कुशल है । सभी डेटा के लिए extents आवंटित करने के साथ-साथ, आप उन्हें हटाकर मुक्त नहीं कर रहे हैं, इसलिए आप संभावित रूप से अंतरिक्ष को बर्बाद कर रहे हैं जब तक कि तालिका पुराने आकार में नहीं बढ़ती। और आप डालने और हटाने दोनों पर पूर्ववत करें / फिर से कर रहे हैं। जिम का जवाब बहुत ही सरलता से दिया गया है।