नई तालिका में कॉपी संरचना


91

क्या सभी कुंजियों और बाधाओं सहित डेटा के बिना, एक तालिका की संरचना को एक नई तालिका में कॉपी करने का एक तरीका है?

जवाबों:


106

एक साधारण स्कीमा कॉपी के लिए क्लॉज की तरह उपयोग करें।

CREATE TABLE new_table_name ( like old_table_name including all)

13
वर्थ नोटिंग आप सिंटैक्स का उपयोग करते समय नए कॉलम भी जोड़ सकते हैं:CREATE TABLE new (like old, extra_column text);
ब्रैड कोच

@BradKoch क्या इस कथन में अतिरिक्त अवरोध जोड़ना संभव है? या यह एक अलग होना चाहिए?
एंड्री डाइनको

@AndreyDeineko यह निर्भर करता है, पूर्ण विवरण के लिए तालिका तालिका डॉक्स की जाँच करें। आप इस वाक्यविन्यास का उपयोग करके आसानी से चेक और विदेशी कुंजी बाधाओं को जोड़ सकते हैं, जैसे किसी भी अन्य कथन को बनाते हैं, लेकिन मुझे यकीन नहीं है कि स्तंभ स्तर की बाधाएं जैसे शून्य नहीं बाद में परिवर्तन के बिना लागू किया जा सकता है।
ब्रैड कोच

2
अभी-अभी कोशिश की। विदेशी-कुंजी बाधाओं और ट्रिगर की प्रतिलिपि नहीं बनाई (PostgreSQL 9.2)।
जानिस एल्मरिस

73

ठीक है, एसक्यूएल के साथ आप निकटतम हो सकते हैं:

create table new (
    like old
    including defaults
    including constraints
    including indexes
);

लेकिन यह सब कुछ कॉपी नहीं करेगा। सबसे महत्वपूर्ण चीजें जो गायब हैं, वे हैं प्रमुख कुंजी। इसके अलावा - ट्रिगर्स भी कॉपी नहीं किए जाते हैं। अन्य चीजों के बारे में निश्चित नहीं।

एक और तरीका यह है कि टेबल संरचना को डंप करें, इसे डंप में नाम बदलें, और इसे फिर से लोड करें:

pg_dump -s -t old databases | sed 's/old/new/g' | psql

लेकिन सावधान रहना, कि इस तरह के सरलीकृत सेड भी अन्य स्थानों पर पुराने से नए में बदल जाएगा (उदाहरण के लिए यदि आपके पास "is_scolded" नाम का टेबल कॉलम है तो यह "is_scnewed" हो जाएगा)।

प्रश्न वास्तव में है: आपको इसकी आवश्यकता क्यों है - क्योंकि विभिन्न उद्देश्यों के लिए, मैं विभिन्न तकनीकों का उपयोग करूंगा।


नोट: including constraintsPostgreSQL 8.3
Ragnar123

1
पोस्टग्रेज 9.3 में एक आकर्षण की तरह काम किया :)
गणपति

14
सबसे बढ़िया उत्तर। बस इस बात से सावधान रहें कि यदि आपके पास अनुक्रम में "सीरियल" मान या कोई अन्य कॉलम डिफ़ॉल्ट है, तो यह पुराने टेबल के समान अनुक्रम का उपयोग करेगा! इसलिए यदि आप या तो तालिका में सामान सम्मिलित करते हैं, तो यह दोनों के लिए वृद्धि करेगा।
सूदो

19

तालिका को पूरी तरह से कॉपी करने के लिए, TABLE कमांड का उपयोग करने वाले संक्षिप्त रूप का भी उपयोग किया जा सकता है:

CREATE TABLE films2 AS
    TABLE films
    WITH NO DATA;

अधिक जानकारी यहाँ


दुर्भाग्य से यह डेटा को भी कॉपी करता है - जिस चीज से मैं सवाल समझता हूं वह सिर्फ स्कीमा की नकल करने के बारे में है
जैस्मीन

🙁 आईडी नई तालिका में NULL हैं और डिफ़ॉल्ट मानों की प्रतिलिपि नहीं बनाते हैं।
इलहान

10

PgAdmin पर एक नज़र डालें - अब तक का सबसे आसान तरीका है कि आप क्या चाहते हैं।
तालिका पर राइट-क्लिक करें, लिपियों - बनाएँ।


मेरे पास केवल phpPgAdmin की पहुंच है; मेरे पास सर्वर नहीं है।
एलेक्स एस

काफी उचित। PhpPgAdmin में: तालिका पर जाएँ, निर्यात करें पर क्लिक करें, "संरचना केवल" चुनें और आपके पास आपकी स्क्रिप्ट है
ChssPly76

मुझे पूरा यकीन है कि उनकी इस स्थापना में एक बग होना चाहिए - यह सही फ्रेम में एक खाली पेज दिखाता है जब मैं ऐसा करता हूं: /
एलेक्स एस

1
क्या आपने "शो" या "डाउनलोड" दोनों विकल्पों की कोशिश की? यदि दोनों काम नहीं करते हैं, तो हाँ, यह एक बग हो सकता है। यदि ऐसा है, तो आपको इसे SQL के माध्यम से करने की आवश्यकता होगी, Dav के उत्तर में लिंक पर एक नज़र डालें।
ChssPly76

डाउनलोड बस मुझे एक खाली फ़ाइल देता है।
एलेक्स एस

6

कैसा रहेगा

CREATE TABLE sample_table_copy AS (SELECT * FROM sample_table WHERE 1 = 2)

postgresql.org उत्तर दें


3
दुर्भाग्य से, यह कुंजी, बाधाओं या चूक को संरक्षित नहीं करता है।
सूडो

1
'WHERE 1 = 2' को व्यक्त करने का एक बेहतर तरीका 'WHERE असत्य' होगा या कोई WHERE क्लॉज नहीं होगा, बल्कि 'LIMIT 0' होगा।
केनाकोर्न केटसॉम्बट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.