it-swarm.com.de

Daten von einer SQLite-Datenbank in eine andere kopieren

Ich habe 2 SQLite-Datenbanken mit gemeinsamen Daten, aber unterschiedlichen Zwecken. Ich wollte das erneute Einfügen von Daten vermeiden.

118

Sie müssen die Datenbank X mit der Datenbank Y mit dem Befehl ATTACH verbinden und dann die entsprechenden Insert Into-Befehle für die zu übertragenden Tabellen ausführen.

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

Oder, wenn die Spalten nicht in der Reihenfolge übereinstimmen:

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

Angenommen, ich habe zwei Datenbanken, nämlich allmsa.db und atlanta.db. Angenommen, die Datenbank allmsa.db enthält Tabellen für alle MSAS in den USA und die Datenbank atlanta.db ist leer. 

Unser Ziel ist es, die Tabelle atlanta von allmsa.db nach atlanta.db zu kopieren.

Schritte

  1. sqlite3 atlanta.db (um in die atlanta-Datenbank zu gelangen)
  2. Fügen Sie allmsa.db hinzu. Dies kann mit dem Befehl ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM;.__ erfolgen. Beachten Sie, dass wir den gesamten Pfad der Datenbank angeben, die angefügt werden soll.
  3. Überprüfen Sie die Datenbankliste mit sqlite> .databases Sie können die Ausgabe als sehen
seq-Namensdatei 
--- --------------- -------------------------- --------------------------------
 0 main /mnt/fastaccessDS/core/csv/atlanta.db
2 AM /mnt/fastaccessDS/core/csv/allmsa.db 
  1. jetzt kommst du zu deinem eigentlichen Ziel. Verwenden Sie den Befehl INSERT INTO atlanta SELECT * FROM AM.atlanta;

Dies sollte Ihrem Zweck dienen.

48
Neeraj Chandak

Einfacher und richtiger Weg in einer Zeile:

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

Der Primärschlüssel und die Spaltentypen bleiben erhalten.

33
Bernardo Ramos

Für eine einmalige Aktion können Sie .dump und .read verwenden.

Die Tabelle my_table aus old_db.sqlite ausgeben

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

Lesen Sie den Dump in die neue_db.sqlite, sofern die Tabelle nicht vorhanden ist

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

Jetzt haben Sie Ihren Tisch geklont. Um dies für die gesamte Datenbank zu tun, lassen Sie den Tabellennamen im Befehl .dump einfach weg.

Bonus: Die Datenbanken können unterschiedliche Kodierungen haben.

7
Thinkeye

Objective-C-Code zum Kopieren einer Tabelle aus einer Datenbank in eine andere Datenbank

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

Ich musste Daten aus einer SQL Server-Compact-Datenbank in SQLite verschieben. Mit SQL Server 2008 können Sie mit der rechten Maustaste auf die Tabelle klicken und "Script Table To" und dann "Data to Inserts" auswählen. Kopieren Sie die Einfügeanweisungen. Entfernen Sie die 'GO'-Anweisungen. Die Anwendung wurde erfolgreich ausgeführt, wenn sie mithilfe der' DB Browser for Sqlite'-App auf die sqlite-Datenbank angewendet wird.

0
Michael Gabay

Erstes Szenario: DB1.sqlite und DB2.sqlite haben dieselbe Tabelle (t1), aber DB1 ist aktueller als DB2. Wenn es klein ist, löschen Sie die Tabelle aus DB2 und erstellen Sie sie mit den Daten neu:

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

Zweites Szenario: Wenn es sich um eine große Tabelle handelt, ist die Lösung vom Typ INSERT if not exists möglicherweise besser geeignet. Wenn Sie eine Unique Key -Spalte haben, ist dies einfacher, andernfalls müssen Sie eine Kombination von Feldern (möglicherweise jedes Feld) verwenden, und irgendwann ist es immer noch schneller, nur drop und wiedercreate der Tisch; Es ist immer einfacher (weniger Nachdenken erforderlich).


DAS SETUP: Öffnen Sie SQlite ohne eine Datenbank, die eine temporary im Speicher main db erstellt, dann attach DB1.sqlite und DB2.sqlite

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

und verwenden Sie .databases, um die angehängten Datenbanken und ihre Dateien anzuzeigen.

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