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?
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:
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;
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.
ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM;
nota di comando che diamo l'intero percorso del database da allegare.sqlite> .databases
puoi vedere l'output comefile di nome seq --- --------------- -------------------------------- -------------------------- 0 main /mnt/fastaccessDS/core/csv/atlanta.db 2 AM /mnt/fastaccessDS/core/csv/allmsa.db
INSERT INTO atlanta SELECT * FROM AM.atlanta;Questo dovrebbe servire al tuo scopo.
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.
.dumpcrea il comando CREATE TABLE IF NOT EXISTS ...e non vi sono errori anche se esiste la mia tabella di destinazione.
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.
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);
}
}
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'.
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
UNIQUEe gli PRIMARY KEYattributi, quindi se li hai, dovrai o DROP TABLEmanualmente CREATEe INSERTo utilizzare il metodo.dump e di .read cui sopra @Thinkeye.