Copia dei dati da un database SQLite a un altro


141

Ho 2 database SQLite con dati comuni ma con scopi diversi e volevo evitare di reinserire i dati, quindi mi chiedevo se fosse possibile copiare un'intera tabella da un database all'altro?

Risposte:


171

Dovrai collegare il Database X con il Database Y utilizzando il comando ATTACH , quindi eseguire i comandi Insert Into appropriati per le tabelle che desideri trasferire.

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

Oppure, se le colonne non sono abbinate in ordine:

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

1
Inoltre, se si utilizza il programma SQLite Expert Personal, è possibile fare clic con il pulsante destro del mouse e ATTACCARE i database
mehmet,

6
Devi prima creare la tabella!
Cris Luengo,

55

Considera un esempio in cui ho due database, vale a dire allmsa.db e atlanta.db. Supponiamo che il database allmsa.db abbia tabelle per tutti i msas negli Stati Uniti e che il database atlanta.db sia vuoto.

Il nostro obiettivo è copiare la tabella atlanta da allmsa.db in atlanta.db.

passi

  1. sqlite3 atlanta.db (per accedere al database atlanta)
  2. Allega allmsa.db. Questo può essere fatto usando la ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM; nota di comando che diamo l'intero percorso del database da allegare.
  3. controlla la lista del database usando sqlite> .databases puoi vedere l'output come
file di nome seq                                                      
--- --------------- -------------------------------- --------------------------
0 main /mnt/fastaccessDS/core/csv/atlanta.db                  
2 AM /mnt/fastaccessDS/core/csv/allmsa.db 
  1. ora vieni al tuo vero obiettivo. Usa il comando INSERT INTO atlanta SELECT * FROM AM.atlanta;

Questo dovrebbe servire al tuo scopo.


2
Utilizzando "INSERT INTO atlanta SELECT * FROM AM.atlanta;" cose incasinate. Ha copiato tutti i dati ma alcuni campi sono stati scambiati! Non usarlo. Invece usa il comando dalla risposta accettata, o ancora più esplicitamente: "INSERISCI IN X.TABLE (Id, Valore) SELEZIONA Id, Valore DA Y.TABLE; Questo ha funzionato bene per me.
Karim Sonbol

@KarimSonbol L'unica differenza è che nel trasferimento delle risposte accettate viene eseguito DAL database in cui ti trovi, AL database allegato, mentre in questa risposta è il contrario.
Tulains Córdova,

@ TulainsCórdova: la risposta accettata (ultima variante) implica che è diversa in quanto funziona anche quando "le colonne non sono abbinate in ordine". Stai dicendo che non è vero?
LarsH

52

Modo più semplice e corretto su una sola riga:

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

La chiave primaria e i tipi di colonne verranno conservati.


1
Questo è ovvio ... ma se esiste già una tabella con quel nome nel database di destinazione, non è possibile. Quindi non è possibile aggiungere dati già esistenti con quella soluzione (ottimo altrimenti)
Martin Meeser

@MartinMeeser La domanda riguarda la copia della tabella e non l'unione delle tabelle. Puoi provare a unire scaricando un file temporaneo, modificando il file rimuovendo l'istruzione CREATE TABLE e usando il file temporaneo come input per new.db. Ma possono verificarsi conflitti sulla chiave primaria
Bernardo Ramos,

@MartinMeeser, la fusione funziona davvero, se esiste una tabella nel DB di destinazione, riceverai un messaggio di errore, ma i dati verranno copiati.
Vincnetas,

3
@MartinMeeser nella versione di SQLite I installata (v3.19.3), .dumpcrea il comando CREATE TABLE IF NOT EXISTS ...e non vi sono errori anche se esiste la mia tabella di destinazione.
Ingegnere inverso,

1
Modo semplice e compatibile con UNIX per risolvere il problema. Ti meriti il ​​mio voto. Grazie!
Augusto Destrero,

10

Per un'azione singola, puoi usare .dump e .read.

Scarica la tabella my_table da old_db.sqlite

c:\sqlite>sqlite3.exe old_db.sqlite
sqlite> .output mytable_dump.sql
sqlite> .dump my_table
sqlite> .quit

Leggi il dump in new_db.sqlite supponendo che la tabella non esista

c:\sqlite>sqlite3.exe new_db.sqlite
sqlite> .read mytable_dump.sql

Ora hai clonato il tuo tavolo. Per fare ciò per l'intero database, è sufficiente tralasciare il nome della tabella nel comando .dump.

Bonus: i database possono avere codifiche diverse.


7

Codice Objective-C per copiare la tabella da un database a un altro database

-(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

Avevo bisogno di spostare i dati da un database compatto di SQL Server a SQLite, quindi utilizzando SQL Server 2008 è possibile fare clic con il pulsante destro del mouse sulla tabella e selezionare "Tabella script in" e quindi "Dati da inserire". Copia le istruzioni di inserimento rimuove le istruzioni 'GO' ed è stata eseguita correttamente quando applicata al database sqlite usando l'app 'DB Browser for Sqlite'.


0

Primo scenario: DB1.sqlite e DB2.sqlite hanno la stessa tabella (t1), ma DB1 è più "aggiornato" di DB2. Se è piccolo, elimina la tabella da DB2 e ricreala con i dati:

> DROP TABLE IF EXISTS db2.t1; CREATE TABLE db2.t1 AS SELECT * FROM db1.t1;

Secondo scenario: se si tratta di una tabella di grandi dimensioni, potresti stare meglio con una INSERT if not existssoluzione di tipo. Se hai una Unique Keycolonna è più semplice, altrimenti dovresti usare una combinazione di campi (forse ogni campo) e ad un certo punto è ancora più veloce semplicemente drope ri- createla tabella; è sempre più diretto (meno pensiero necessario).


IL SETUP: apri SQLite senza un DB che crea un database temporaryin memoria main, quindi attachDB1.sqlite e DB2.sqlite

> sqlite3
sqlite> ATTACH "DB1.sqlite" AS db1
sqlite> ATTACH "DB2.sqlite" AS db2

e usare .databasesper vedere i database allegati e i loro file.

sqlite> .databases
main: 
db1: /db/DB1.sqlite
db2: /db/DB2.sqlite

NOTA: Questo non conserva UNIQUEe gli PRIMARY KEYattributi, quindi se li hai, dovrai o DROP TABLEmanualmente CREATEe INSERTo utilizzare il metodo.dump e di .read cui sopra @Thinkeye.
In grado di Mac
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.