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.
.dump
crea 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 exists
soluzione di tipo. Se hai una Unique Key
colonna è più semplice, altrimenti dovresti usare una combinazione di campi (forse ogni campo) e ad un certo punto è ancora più veloce semplicemente drop
e ri- create
la tabella; è sempre più diretto (meno pensiero necessario).
IL SETUP: apri SQLite senza un DB che crea un database temporary
in memoria main
, quindi attach
DB1.sqlite e DB2.sqlite
> sqlite3
sqlite> ATTACH "DB1.sqlite" AS db1
sqlite> ATTACH "DB2.sqlite" AS db2
e usare .databases
per vedere i database allegati e i loro file.
sqlite> .databases
main:
db1: /db/DB1.sqlite
db2: /db/DB2.sqlite
UNIQUE
e gli PRIMARY KEY
attributi, quindi se li hai, dovrai o DROP TABLE
manualmente CREATE
e INSERT
o utilizzare il metodo.dump
e di .read
cui sopra @Thinkeye.