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.
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.
Respuestas:
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;
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.
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á.sqlite> .databases
puede ver la salida comoarchivo de nombre seq --- --------------- -------------------------------- -------------------------- 0 main /mnt/fastaccessDS/core/csv/atlanta.db 2 AM /mnt/fastaccessDS/core/csv/allmsa.db
INSERT INTO atlanta SELECT * FROM AM.atlanta;
Esto debería servir a su propósito.
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.
.dump
crea el comando CREATE TABLE IF NOT EXISTS ...
y no hay ningún error a pesar de que mi tabla de destino existe.
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.
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);
}
}
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'.
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 exists
solución tipo. Si tiene una Unique Key
columna, 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 drop
reajustar create
la 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 temporary
en memoria main
, luego attach
DB1.sqlite y DB2.sqlite
> sqlite3
sqlite> ATTACH "DB1.sqlite" AS db1
sqlite> ATTACH "DB2.sqlite" AS db2
y use .databases
para ver las bases de datos adjuntas y sus archivos.
sqlite> .databases
main:
db1: /db/DB1.sqlite
db2: /db/DB2.sqlite
UNIQUE
y PRIMARY KEY
, por lo tanto, si los tiene, DROP TABLE
deberá hacerlo manualmente CREATE
y INSERT
utilizar el método.dump
y .read
mencionado anteriormente por @Thinkeye.