J'ai 2 bases de données SQLite avec des données communes mais avec des objectifs différents et je voulais éviter de réinsérer des données. Je me demandais s'il était possible de copier une table entière d'une base de données à une autre?
Vous devez attacher la base de données X à la base de données Y à l'aide de la commande ATTACH , puis exécuter les commandes appropriées Insérer pour les tables à transférer.
INSERT INTO X.TABLE SELECT * FROM Y.TABLE;
Ou, si les colonnes ne correspondent pas dans l'ordre:
INSERT INTO X.TABLE(fieldname1, fieldname2) SELECT fieldname1, fieldname2 FROM Y.TABLE;
Prenons un exemple où j'ai deux bases de données, à savoir allmsa.db et atlanta.db. Supposons que la base de données allmsa.db contient des tables pour tous les msas aux États-Unis et que la base de données atlanta.db est vide.
Notre objectif est de copier la table atlanta de allmsa.db vers atlanta.db.
ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM;
Notez que nous donnons le chemin complet de la base de données à attacher.sqlite> .databases
vous pouvez voir le résultat sous la formefichier de nom seq --- --------------- -------------------------- -------------------------------- 0 main /mnt/fastaccessDS/core/csv/atlanta.db 2 AM /mnt/fastaccessDS/core/csv/allmsa.db
INSERT INTO atlanta SELECT * FROM AM.atlanta;
Cela devrait servir votre but.
Manière la plus simple et correcte sur une seule ligne:
sqlite3 old.db ".dump mytable" | sqlite3 new.db
La clé primaire et les types de colonnes seront conservés.
Pour une action ponctuelle, vous pouvez utiliser .dump et .read.
Vide la table my_table de old_db.sqlite
c:\sqlite>sqlite3.exe old_db.sqlite
sqlite> .output mytable_dump.sql
sqlite> .dump my_table
sqlite> .quit
Lire le dump dans le new_db.sqlite en supposant que la table n'existe pas
c:\sqlite>sqlite3.exe new_db.sqlite
sqlite> .read mytable_dump.sql
Maintenant, vous avez cloné votre table. Pour cela, il suffit de laisser le nom de la table dans la commande .dump.
Bonus: Les bases de données peuvent avoir différents encodages.
Code Objective-C pour copier la table d'une base de données vers une autre base de données
-(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);
}
}
J'avais besoin de déplacer les données d'une base de données compacte SQL Server vers SQLite. Pour utiliser SQL Server 2008, vous pouvez alors cliquer avec le bouton droit de la souris sur la table et sélectionner "Table de script Vers", puis "Données en insertions". Copiez les instructions insert, supprimez les instructions 'GO' et elles s'exécutent correctement lorsqu'elles sont appliquées à la base de données sqlite à l'aide de l'application 'DB Browser for Sqlite'.
Premier scénario: DB1.sqlite et DB2.sqlite ont la même table (t1), mais DB1 est plus "à jour" que DB2. S'il est petit, supprimez la table de DB2 et recréez-la avec les données:
>DROP TABLE IF EXISTS db2.t1; CREATE TABLE db2.t1 AS SELECT * FROM db1.t1;
Deuxième scénario: s'il s'agit d'une table volumineuse, il vaut peut-être mieux utiliser une solution de type INSERT if not exists
. Si vous avez une colonne Unique Key
c'est plus simple, sinon vous devrez utiliser une combinaison de champs (peut-être tous les champs) et à un moment donné, il sera encore plus rapide de simplement drop
et re -create
la table; c'est toujours plus simple (moins de réflexion requise).
LA CONFIGURATION: ouvrez SQlite sans base de données qui crée un temporary
en mémoire main
db, puis attach
DB1.sqlite et DB2.sqlite
>sqlite3
sqlite> ATTACHE "DB1.sqlite" AS db1
sqlite> ATTACHE "DB2.sqlite" AS db2
et utilisez .databases
pour voir les bases de données attachées et leurs fichiers.
sqlite> .databases
main:
db1: /db/DB1.sqlite
db2: /db/DB2.sqlite