web-dev-qa-db-fra.com

Copier des données d'une base de données SQLite vers une autre

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?

118
Leonardo Marques

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;
152

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.

Pas

  1. sqlite3 atlanta.db (pour aller dans la base de données atlanta)
  2. Joignez allmsa.db. Ceci peut être fait en utilisant la commande ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM; Notez que nous donnons le chemin complet de la base de données à attacher.
  3. vérifiez la liste de bases de données en utilisant sqlite> .databasesvous pouvez voir le résultat sous la forme
fichier de nom seq 
--- --------------- -------------------------- --------------------------------
 0 main /mnt/fastaccessDS/core/csv/atlanta.db
 2 AM /mnt/fastaccessDS/core/csv/allmsa.db 
  1. maintenant vous arrivez à votre cible réelle. Utilisez la commande INSERT INTO atlanta SELECT * FROM AM.atlanta;

Cela devrait servir votre but.

48
Neeraj Chandak

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.

33
Bernardo Ramos

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.

7
Thinkeye

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

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'.

0
Michael Gabay

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
0
Able Mac