2012-10-04 13 views
27

में तालिका तालिका को नई तालिका में कॉपी करें क्या मौजूदा तालिका संरचना को नए में कॉपी करने का कोई आसान तरीका है? (न डेटा, केवल संरचना की जरूरत है -> आईडी पूर्णांक, नाम varchar (20) की तरह ...)sqlite3

Thx

उत्तर

59

आप इस प्रकार का आदेश इस्तेमाल कर सकते हैं:

CREATE TABLE copied AS SELECT * FROM mytable WHERE 0 

लेकिन SQLite के गतिशील टाइपिंग के कारण, अधिकांश प्रकार की जानकारी खो जाएगी।

यदि आपको केवल एक सारणी की आवश्यकता है जो मूल की तरह व्यवहार करता है, यानी, समान संख्या और स्तंभों के नाम हैं, और समान मानों को स्टोर कर सकते हैं, यह पर्याप्त है।

तुम सच में वास्तव में मूल की तरह प्रकार की जानकारी की जरूरत है, तो आप sqlite_master मेज से मूल SQL CREATE TABLE बयान, इस तरह पढ़ सकते हैं:

SELECT sql FROM sqlite_master WHERE type='table' AND name='mytable' 
+2

लेकिन नई तालिका बनाने के लिए आप अपने चयन कथन से आउटपुट का उपयोग कैसे करते हैं? – malhal

+1

यह एसक्यूएल कमांड है। आप इसे निष्पादित करते हैं। –

+4

मुझे लगता है कि इंडिकिडुक पूछ रहा है कि एसक्यूएल के भीतर से प्रोग्रामेटिक तरीके से ऐसा करने का कोई तरीका है या नहीं, और मुझे लगता है कि यह एक अच्छा सवाल है। यदि ऐसा करने का कोई तरीका है तो यह उत्तर में सुधार होगा। – metasoarous

9

SQLite पी, चूक और सूचकांक के साथ तालिका क्लोन नहीं कर सकते।

किसी अन्य उपकरण द्वारा हैकिंग आवश्यक है।

खोल में, तालिका नाम को sed द्वारा प्रतिस्थापित करें।

sqlite3 dbfile '.schema oldtable' | sed '1s/oldtable/newtable/' | sqlite3 dbfile 

और आप नई तालिका देख सकते हैं।

sqlite3 dbfile '.schema newtable' 

प्राथमिक कुंजी, डिफ़ॉल्ट और सूचकांक आरक्षित होंगे।

मुझे आशा है कि यह आदेश आपकी मदद कर सकता है।

-1

मैं पसंद करेंगे:

> sqlite3 <db_file> 

sqlite3 > .output <output_file> 
sqlite3 > .dump <table_name> 

रेखा से ऊपर तालिका DDL और DML कथन शामिल डंप उत्पन्न करता है।

इस फ़ाइल में परिवर्तन करें, अर्थात खोजने के लिए और नई तालिका नाम

इसके अलावा के साथ तालिका नाम की जगह, की जगह "CREATE TRIGGER ""CREATE TRIGGER <NEWTABLE>_" साथ, यह उस पर एक नई तालिका नाम के साथ ट्रिगर नाम के साथ मौजूदा चलाता की जगह लेगा। इससे यह अद्वितीय हो जाएगा और मौजूदा ट्रिगर्स के साथ संघर्ष नहीं होगा। एक बार सभी स्कीमा परिवर्तन लागू कर रहे हैं, यह डेटाबेस में वापस .read

sqlite3 > .read output_file 

का उपयोग करके पढ़ा इस तरह खोल आदेशों का उपयोग करते खोल फ़ाइल में पटकथा जा सकता है:

echo ".dump <table>" | sqlite3 <db_file> > <table_file> 
sed -i.bak "s/\b<table_name>\b/<new_table_name>/g" <table_file> 
sed -i.bak "s/\bCREATE TRIGGER \b/CREATE TRIGGER <new_table_name_>/g" <table_file> 
echo ".read <table_file>" | sqlite3 <db_file> 
rm <table_name>.bak 

उदाहरण के लिए:

यदि आपके पास तालिका टी और नई तालिका डीबी फ़ाइल डी में टीक्लोन है फ़ाइल फ़ाइल के साथ डी: फिर

echo ".dump T" | sqlite3 D.sqlite > F 
sed -i.bak "s/\bT\b/TClone/g" F 
sed -i.bak "s/\bCREATE TRIGGER \b/CREATE TRIGGER TClone_>/g" F 
echo ".read F" | sqlite3 D.sqlite 
rm T.bak 

अंत में, आप एक पैरामीटर संस्करण बनाकर इस स्क्रिप्ट को सामान्यीकृत कर सकते हैं जहां आप स्रोत_टेबल, destination_table, db_file को ऐसे पैरामीटर के रूप में पास कर सकते हैं जिनका उपयोग किसी भी तालिका को क्लोन करने के लिए किया जा सकता है।

मैंने इसका परीक्षण किया और यह काम करता है।

परीक्षण:

sqlite3 <database_file> 
sqlite3 > select * from <new_table>; 

आप मूल तालिका के रूप में एक ही परिणाम देना चाहिए। और

sqlite3 > .schema <new_table> 

के पास एक नए नाम के साथ मूल तालिका के समान स्कीमा होना चाहिए।