Copiar datos de una base de datos SQLite a otra

141

Tengo 2 bases de datos SQLite con datos comunes pero con diferentes propósitos y quería evitar volver a insertar los datos, por lo que me preguntaba si era posible copiar una tabla completa de una base de datos a otra.

Leonardo Marques
fuente

Respuestas:

171

Tendrá que adjuntar la Base de datos X con la Base de datos Y utilizando el comando ATTACH , luego ejecutar los comandos Insertar en apropiados para las tablas que desea transferir.

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

O, si las columnas no coinciden en orden:

INSERT INTO X.TABLE(fieldname1, fieldname2) SELECT fieldname1, fieldname2 FROM Y.TABLE;
Michael D. Irizarry
fuente
1
Además, si está utilizando el programa SQLite Expert Personal, le da la oportunidad de hacer clic derecho y ADJUNTAR bases de datos
mehmet
66
¡Necesitas crear la tabla primero!
Cris Luengo
55

Considere un ejemplo donde tengo dos bases de datos, a saber, allmsa.db y atlanta.db. Digamos que la base de datos allmsa.db tiene tablas para todos los msas en EE. UU. Y la base de datos atlanta.db está vacía.

Nuestro objetivo es copiar la tabla atlanta de allmsa.db a atlanta.db.

Pasos

  1. sqlite3 atlanta.db (para ir a la base de datos de atlanta)
  2. Adjunte allmsa.db. Esto se puede hacer usando la ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM; nota de comando que le damos a la ruta completa de la base de datos que se adjuntará.
  3. verifique la lista de la base de datos usando sqlite> .databases puede ver la salida como
archivo de nombre seq                                                      
--- --------------- -------------------------------- --------------------------
0 main /mnt/fastaccessDS/core/csv/atlanta.db                  
2 AM /mnt/fastaccessDS/core/csv/allmsa.db 
  1. ahora llegas a tu objetivo real. Usa el comando INSERT INTO atlanta SELECT * FROM AM.atlanta;

Esto debería servir a su propósito.

Neeraj Chandak
fuente
2
Usando 'INSERT INTO atlanta SELECT * FROM AM.atlanta;' cosas en mal estado. Copió todos los datos pero se intercambiaron algunos campos. No lo uses En su lugar, use el comando de la respuesta aceptada, o incluso más explícitamente: "INSERTAR EN X.TABLE (Id, Value) SELECT Id, Value FROM Y.TABLE; Esto funcionó bien para mí.
Karim Sonbol
@KarimSonbol La única diferencia es que en la respuesta aceptada la transferencia se realiza DESDE la base de datos en la que se encuentra, A la base de datos adjunta, mientras que en esta respuesta es al revés.
Tulains Córdova
@ TulainsCórdova: la respuesta aceptada (última variante) implica que es diferente en el sentido de que funciona incluso cuando "las columnas no coinciden en orden". ¿Estás diciendo que eso no es verdad?
LarsH
52

La forma más fácil y correcta en una sola línea:

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

La clave principal y los tipos de columnas se mantendrán.

Bernardo Ramos
fuente
1
Esto es algo obvio ... pero si ya hay una tabla con ese nombre en la base de datos de destino, no es posible. Por lo tanto, no es posible agregar datos ya existentes con esa solución (de lo contrario, excelente)
Martin Meeser
@MartinMeeser La pregunta es sobre copiar la tabla, no fusionar tablas. Puede intentar fusionar volcando a un archivo temporal, editando el archivo eliminando la instrucción CREATE TABLE y utilizando el archivo temporal como entrada para new.db. Pero los conflictos en la clave principal pueden suceder
Bernardo Ramos el
@MartinMeeser, la fusión realmente funciona, si la tabla existe en la base de datos de destino, recibirá un mensaje de error, pero los datos se copiarán.
Vincnetas
3
@MartinMeeser en la versión de SQLite que he instalado (v3.19.3), .dumpcrea el comando CREATE TABLE IF NOT EXISTS ...y no hay ningún error a pesar de que mi tabla de destino existe.
Ingeniero invertido el
1
Forma simple y amigable para resolver el problema. Te mereces mi voto positivo. ¡Gracias!
Augusto Destrero
9

Para una acción única, puede usar .dump y .read.

Volcar la tabla my_table de old_db.sqlite

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

Lea el volcado en new_db.sqlite suponiendo que la tabla no existe

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

Ahora has clonado tu mesa. Para hacer esto para toda la base de datos, simplemente omita el nombre de la tabla en el comando .dump.

Bonificación: las bases de datos pueden tener diferentes codificaciones.

Thinkeye
fuente
7

Código Objective-C para copiar la tabla de una base de datos a otra base de datos

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

Necesitaba mover datos de una base de datos compacta de servidor sql a sqlite, por lo que usando sql server 2008 puede hacer clic derecho en la tabla y seleccionar 'Script Table To' y luego 'Data to Inserts'. Copie las instrucciones de inserción, elimine las instrucciones 'GO' y se ejecutará con éxito cuando se aplique a la base de datos sqlite utilizando la aplicación 'DB Browser for Sqlite'.

Michael Gabay
fuente
0

Primer escenario: DB1.sqlite y DB2.sqlite tienen la misma tabla (t1), pero DB1 está más "actualizado" que DB2. Si es pequeño, suelte la tabla de DB2 y vuelva a crearla con los datos:

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

Segundo escenario: si se trata de una tabla grande, es mejor que tenga una INSERT if not existssolución tipo. Si tiene una Unique Keycolumna, es más sencilla; de lo contrario, necesitaría usar una combinación de campos (tal vez todos los campos) y en algún momento aún es más rápido simplemente dropreajustar createla tabla; siempre es más sencillo (se requiere menos reflexión).


LA CONFIGURACIÓN: abra SQLite sin una base de datos que cree una base de datos temporaryen memoria main, luego attachDB1.sqlite y DB2.sqlite

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

y use .databasespara ver las bases de datos adjuntas y sus archivos.

sqlite> .databases
main: 
db1: /db/DB1.sqlite
db2: /db/DB2.sqlite
Mac capaz
fuente
NOTA: Esto no conserva los atributos UNIQUEy PRIMARY KEY, por lo tanto, si los tiene, DROP TABLEdeberá hacerlo manualmente CREATEy INSERTutilizar el método.dump y .read mencionado anteriormente por @Thinkeye.
Capaz Mac