मेरे पास सामान्य डेटा के साथ 2 SQLite डेटाबेस हैं, लेकिन अलग-अलग उद्देश्यों के साथ और मैं डेटा को फिर से बेचना से बचना चाहता था, इसलिए मैं सोच रहा था कि क्या एक डेटाबेस से दूसरे तक पूरी तालिका की प्रतिलिपि बनाना संभव है?
मेरे पास सामान्य डेटा के साथ 2 SQLite डेटाबेस हैं, लेकिन अलग-अलग उद्देश्यों के साथ और मैं डेटा को फिर से बेचना से बचना चाहता था, इसलिए मैं सोच रहा था कि क्या एक डेटाबेस से दूसरे तक पूरी तालिका की प्रतिलिपि बनाना संभव है?
जवाबों:
आपको ATTACH कमांड का उपयोग करके डेटाबेस Y को डेटाबेस Y के साथ संलग्न करना होगा , फिर उन तालिकाओं के लिए उपयुक्त इंसर्ट कमांड चलाएं जिन्हें आप स्थानांतरित करना चाहते हैं।
INSERT INTO X.TABLE SELECT * FROM Y.TABLE;
या, यदि स्तंभ क्रम में मेल नहीं खाते हैं:
INSERT INTO X.TABLE(fieldname1, fieldname2) SELECT fieldname1, fieldname2 FROM Y.TABLE;
एक उदाहरण पर विचार करें जहां मेरे पास दो डेटाबेस हैं जैसे कि allmsa.db और atlanta.db। कहें कि डेटाबेस allmsa.db में यूएस के सभी msas के लिए टेबल हैं और डेटाबेस atlanta.db खाली है।
हमारा लक्ष्य तालिका atlanta को allmsa.db से atlanta.db पर कॉपी करना है।
ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM;
नोट का उपयोग करके किया जा सकता है जो हम डेटाबेस के पूरे पथ को संलग्न करने के लिए देते हैं।sqlite> .databases
आप आउटपुट को किस रूप में देख सकते हैंseq नाम फ़ाइल --- --------------- -------------------------------- -------------------------- 0 मुख्य /mnt/fastaccessDS/core/csv/atlanta.db 2 AM /mnt/fastaccessDS/core/csv/allmsa.db
INSERT INTO atlanta SELECT * FROM AM.atlanta;इससे अपने उद्देश्य की पूर्ति होनी चाहिए।
सबसे आसान और एक ही लाइन पर सही तरीका:
sqlite3 old.db ".dump mytable" | sqlite3 new.db
प्राथमिक कुंजी और कॉलम प्रकार रखे जाएंगे।
.dumpहै, कमांड बनाता है CREATE TABLE IF NOT EXISTS ..., और मेरी गंतव्य तालिका मौजूद होने के बावजूद कोई त्रुटि नहीं है।
एक समय की कार्रवाई के लिए, आप .dump और .read का उपयोग कर सकते हैं।
पुराने_db.sqlite से तालिका my_table को डंप करें
c:\sqlite>sqlite3.exe old_db.sqlite
sqlite> .output mytable_dump.sql
sqlite> .dump my_table
sqlite> .quit
डंप पढ़ें new_db.sqlite में यह मानते हुए कि तालिका मौजूद नहीं है
c:\sqlite>sqlite3.exe new_db.sqlite
sqlite> .read mytable_dump.sql
अब आपने अपनी टेबल पर क्लोन कर लिया है। पूरे डेटाबेस के लिए ऐसा करने के लिए, बस .dump कमांड में टेबल का नाम छोड़ दें।
बोनस: डेटाबेस में अलग-अलग एनकोडिंग हो सकते हैं।
एक डेटाबेस से दूसरे डेटाबेस में कॉपी टेबल के लिए उद्देश्य-सी कोड
-(void) createCopyDatabase{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSString *maindbPath = [documentsDir stringByAppendingPathComponent:@"User.sqlite"];;
NSString *newdbPath = [documentsDir stringByAppendingPathComponent:@"User_copy.sqlite"];
NSFileManager *fileManager = [NSFileManager defaultManager];
char *error;
if ([fileManager fileExistsAtPath:newdbPath]) {
[fileManager removeItemAtPath:newdbPath error:nil];
}
sqlite3 *database;
//open database
if (sqlite3_open([newdbPath UTF8String], &database)!=SQLITE_OK) {
NSLog(@"Error to open database");
}
NSString *attachQuery = [NSString stringWithFormat:@"ATTACH DATABASE \"%@\" AS aDB",maindbPath];
sqlite3_exec(database, [attachQuery UTF8String], NULL, NULL, &error);
if (error) {
NSLog(@"Error to Attach = %s",error);
}
//Query for copy Table
NSString *sqlString = @"CREATE TABLE Info AS SELECT * FROM aDB.Info";
sqlite3_exec(database, [sqlString UTF8String], NULL, NULL, &error);
if (error) {
NSLog(@"Error to copy database = %s",error);
}
//Query for copy Table with Where Clause
sqlString = @"CREATE TABLE comments AS SELECT * FROM aDB.comments Where user_name = 'XYZ'";
sqlite3_exec(database, [sqlString UTF8String], NULL, NULL, &error);
if (error) {
NSLog(@"Error to copy database = %s",error);
}
}
मुझे एक sql सर्वर कॉम्पैक्ट डेटाबेस से sqlite में डेटा स्थानांतरित करने की आवश्यकता थी, इसलिए sql सर्वर 2008 का उपयोग करके आप तालिका पर राइट क्लिक कर सकते हैं और 'Script Table To' और फिर 'Data to Inserts' का चयन कर सकते हैं। इंसर्ट स्टेटमेंट को कॉपी करके 'जीओ' स्टेटमेंट को हटा दें और 'डीबी ब्राउजर फॉर सकलाइट' ऐप का इस्तेमाल करते हुए यह सफलतापूर्वक निष्पादित हो जाता है।
पहला परिदृश्य: DB1.sqlite और DB2.sqlite में समान तालिका (t1) है, लेकिन DB1 DB2 की तुलना में अधिक "अद्यतित" है। यदि यह छोटा है, तो DB2 से तालिका को छोड़ें और इसे डेटा के साथ फिर से बनाएँ:
> DROP TABLE IF EXISTS db2.t1; CREATE TABLE db2.t1 AS SELECT * FROM db1.t1;
दूसरा परिदृश्य: यदि यह एक बड़ी तालिका है, तो आप एक INSERT if not existsप्रकार के समाधान के साथ बेहतर हो सकते हैं। यदि आपके पास एक Unique Keyस्तंभ है, तो यह अधिक सीधा है, अन्यथा आपको फ़ील्ड (शायद हर फ़ील्ड) के संयोजन का उपयोग करने की आवश्यकता होगी और कुछ बिंदु पर यह अभी भी बस dropऔर फिर createसे तालिका के लिए तेज़ है ; यह हमेशा अधिक सीधा होता है (कम सोच की आवश्यकता होती है)।
SETUP: एक SQL को DB के बिना खोलें जो temporaryमेमोरी mainडेटाबेस में बनाता है , फिर attachDB1.sqlite और DB2.sqlite
> sqlite3
sqlite> ATTACH "DB1.sqlite" AS db1
sqlite> ATTACH "DB2.sqlite" AS db2
और .databasesसंलग्न डेटाबेस और उनकी फ़ाइलों को देखने के लिए उपयोग करें।
sqlite> .databases
main:
db1: /db/DB1.sqlite
db2: /db/DB2.sqlite
UNIQUEऔर PRIMARY KEYविशेषताओं, इसलिए यदि आप उन है, तो आप या तो करने की आवश्यकता होगी DROP TABLEमैन्युअल रूप से और CREATEऔर INSERTया का उपयोग .dumpऔर .read विधि ऊपर उल्लेख किया @Thinkeye द्वारा।