डेटा को एक SQLite डेटाबेस से दूसरे में कॉपी करना


141

मेरे पास सामान्य डेटा के साथ 2 SQLite डेटाबेस हैं, लेकिन अलग-अलग उद्देश्यों के साथ और मैं डेटा को फिर से बेचना से बचना चाहता था, इसलिए मैं सोच रहा था कि क्या एक डेटाबेस से दूसरे तक पूरी तालिका की प्रतिलिपि बनाना संभव है?

जवाबों:


171

आपको ATTACH कमांड का उपयोग करके डेटाबेस Y को डेटाबेस Y के साथ संलग्न करना होगा , फिर उन तालिकाओं के लिए उपयुक्त इंसर्ट कमांड चलाएं जिन्हें आप स्थानांतरित करना चाहते हैं।

INSERT INTO X.TABLE SELECT * FROM Y.TABLE;

या, यदि स्तंभ क्रम में मेल नहीं खाते हैं:

INSERT INTO X.TABLE(fieldname1, fieldname2) SELECT fieldname1, fieldname2 FROM Y.TABLE;

1
यदि SQLite विशेषज्ञ व्यक्तिगत कार्यक्रम का उपयोग कर रहा है, तो यह राइट क्लिक और ATTACH डेटाबेस के लिए एक मौका देता है
mehmet

6
आपको पहले तालिका बनाने की आवश्यकता है!
क्रिस Luengo

55

एक उदाहरण पर विचार करें जहां मेरे पास दो डेटाबेस हैं जैसे कि allmsa.db और atlanta.db। कहें कि डेटाबेस allmsa.db में यूएस के सभी msas के लिए टेबल हैं और डेटाबेस atlanta.db खाली है।

हमारा लक्ष्य तालिका atlanta को allmsa.db से atlanta.db पर कॉपी करना है।

कदम

  1. sqlite3 atlanta.db (एटलांटा डेटाबेस में जाने के लिए)
  2. Allmsa.db संलग्न करें। यह कमांड ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM; नोट का उपयोग करके किया जा सकता है जो हम डेटाबेस के पूरे पथ को संलग्न करने के लिए देते हैं।
  3. डेटाबेस सूची का उपयोग करके जाँच करें कि sqlite> .databases आप आउटपुट को किस रूप में देख सकते हैं
seq नाम फ़ाइल                                                      
--- --------------- -------------------------------- --------------------------
0 मुख्य /mnt/fastaccessDS/core/csv/atlanta.db                  
2 AM /mnt/fastaccessDS/core/csv/allmsa.db 
  1. अब आप अपने वास्तविक लक्ष्य पर आते हैं। कमांड का उपयोग करें INSERT INTO atlanta SELECT * FROM AM.atlanta;

इससे अपने उद्देश्य की पूर्ति होनी चाहिए।


2
'INSERT INTO atlanta SELECT * FROM AM.atlanta;' का उपयोग करना चीजें गड़बड़ कर दीं। इसने सभी डेटा को कॉपी किया लेकिन कुछ फ़ील्ड स्वैप किए गए! इसका उपयोग न करें। इसके बजाय स्वीकार किए गए उत्तर से, या उससे भी अधिक स्पष्ट रूप से कमांड का उपयोग करें: "INSERT INTO X.TABLE (Id, Value) Select Id, Value FROM Y.TABLE; इसने मेरे लिए ठीक काम किया।
करीम सोनोल

@KarimSonbol केवल अंतर यह है कि स्वीकृत उत्तर हस्तांतरण में आप संलग्न डेटाबेस से बैटबॉब के FROM, TO में किया जाता है, जबकि इस उत्तर में दूसरा तरीका है।
ट्यूलेंस कोरडोवा

@ TulainsCórdova: स्वीकृत उत्तर (अंतिम संस्करण) का अर्थ है कि यह अलग है कि यह तब भी काम करता है जब "कॉलम क्रम में मेल नहीं खाते हैं।" क्या आप कह रहे हैं कि यह सच नहीं है?
लार्स

52

सबसे आसान और एक ही लाइन पर सही तरीका:

sqlite3 old.db ".dump mytable" | sqlite3 new.db

प्राथमिक कुंजी और कॉलम प्रकार रखे जाएंगे।


1
यह स्पष्ट है ... लेकिन अगर लक्ष्य-डेटाबेस में उस नाम के साथ पहले से ही एक तालिका है, तो यह संभव नहीं है। इसलिए उस समाधान के साथ पहले से मौजूद डेटा को जोड़ना संभव नहीं है (महान अन्यथा)
मार्टिन मेसेर

@MartinMeeser तालिका को मर्ज नहीं करने वाली तालिका की प्रतिलिपि बनाने के बारे में प्रश्न है। आप एक अस्थायी फ़ाइल में डंपिंग द्वारा विलय करने की कोशिश कर सकते हैं, फ़ाइल को क्रिएट टेबल स्टेटमेंट को हटाकर और अस्थायी फ़ाइल को new.db के इनपुट के रूप में उपयोग कर सकते हैं। लेकिन प्राथमिक कुंजी पर संघर्ष हो सकता है
बर्नार्डो रामोस

@MartinMeeser, वास्तव में विलय कार्य करता है, यदि तालिका लक्ष्य DB में मौजूद है तो आपको त्रुटि संदेश मिलेगा, लेकिन डेटा की प्रतिलिपि बनाई जाएगी।
विंसनेट

3
@MartinMeeser SQLite के संस्करण में मैंने (v3.19.3) स्थापित किया .dumpहै, कमांड बनाता है CREATE TABLE IF NOT EXISTS ..., और मेरी गंतव्य तालिका मौजूद होने के बावजूद कोई त्रुटि नहीं है।
उल्टा इंजीनियर

1
समस्या को हल करने का सरल, UNIX- अनुकूल तरीका। आप मेरे उत्थान के लायक हैं। धन्यवाद!
अगस्टो डेस्टेरो

10

एक समय की कार्रवाई के लिए, आप .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 कमांड में टेबल का नाम छोड़ दें।

बोनस: डेटाबेस में अलग-अलग एनकोडिंग हो सकते हैं।


7

एक डेटाबेस से दूसरे डेटाबेस में कॉपी टेबल के लिए उद्देश्य-सी कोड

-(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);
        }
 }

0

मुझे एक sql सर्वर कॉम्पैक्ट डेटाबेस से sqlite में डेटा स्थानांतरित करने की आवश्यकता थी, इसलिए sql सर्वर 2008 का उपयोग करके आप तालिका पर राइट क्लिक कर सकते हैं और 'Script Table To' और फिर 'Data to Inserts' का चयन कर सकते हैं। इंसर्ट स्टेटमेंट को कॉपी करके 'जीओ' स्टेटमेंट को हटा दें और 'डीबी ब्राउजर फॉर सकलाइट' ऐप का इस्तेमाल करते हुए यह सफलतापूर्वक निष्पादित हो जाता है।


0

पहला परिदृश्य: 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 द्वारा।
मैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.