Copie de données d'une base de données SQLite vers une autre

141

J'ai 2 bases de données SQLite avec des données communes mais avec des finalités différentes et je voulais éviter de réinsérer des données, alors je me demandais s'il était possible de copier une table entière d'une base de données à une autre?

Leonardo Marques
la source

Réponses:

171

Vous devrez attacher la base de données X à la base de données Y à l'aide de la commande ATTACH , puis exécuter les commandes Insérer dans appropriées pour les tables que vous souhaitez transférer.

INSERT INTO X.TABLE SELECT * FROM Y.TABLE;

Ou, si les colonnes ne sont pas mises en correspondance dans l'ordre:

INSERT INTO X.TABLE(fieldname1, fieldname2) SELECT fieldname1, fieldname2 FROM Y.TABLE;
Michael D. Irizarry
la source
1
De plus, si le programme SQLite Expert Personal est utilisé, il donne la possibilité de cliquer avec le bouton droit de la souris et d'attacher les bases de données
mehmet
6
Vous devez d'abord créer la table!
Cris Luengo
55

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 accéder à la base de données atlanta)
  2. Joindre allmsa.db. Cela 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 des bases de données en utilisant sqlite> .databases vous pouvez voir la sortie comme
fichier de nom seq                                                      
--- --------------- -------------------------------- --------------------------
0 principal /mnt/fastaccessDS/core/csv/atlanta.db                  
2 h 00 /mnt/fastaccessDS/core/csv/allmsa.db 
  1. maintenant vous arrivez à votre objectif réel. Utilisez la commande INSERT INTO atlanta SELECT * FROM AM.atlanta;

Cela devrait servir votre objectif.

Neeraj Chandak
la source
2
Utilisation de 'INSERT INTO atlanta SELECT * FROM AM.atlanta;' tout foiré. Il a copié toutes les données mais certains champs ont été échangés! Ne l'utilisez pas. Utilisez plutôt la commande de la réponse acceptée, ou même plus explicitement: "INSERT INTO X.TABLE (Id, Value) SELECT Id, Value FROM Y.TABLE; Cela a bien fonctionné pour moi.
Karim Sonbol
@KarimSonbol La seule différence est que dans la réponse acceptée, le transfert se fait DEPUIS la base de données dans laquelle vous vous trouvez, VERS la base de données attachée, alors que dans cette réponse, c'est l'inverse.
Tulains Córdova
@ TulainsCórdova: La réponse acceptée (dernière variante) implique qu'elle est différente en ce qu'elle fonctionne même lorsque "les colonnes ne sont pas mises en correspondance". Êtes-vous en train de dire que ce n'est pas vrai?
LarsH
52

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.

Bernardo Ramos
la source
1
C'est assez évident ... mais s'il y a déjà une table avec ce nom dans la base de données cible, ce n'est pas possible. Il n'est donc pas possible d'ajouter des données déjà existantes avec cette solution (super sinon)
Martin Meeser
@MartinMeeser La question est de copier la table sans fusionner les tables. Vous pouvez essayer de fusionner en vidant dans un fichier temporaire, en modifiant le fichier en supprimant l'instruction CREATE TABLE et en utilisant le fichier temporaire comme entrée pour new.db. Mais des conflits sur la clé primaire peuvent survenir
Bernardo Ramos
@MartinMeeser, en fait la fusion fonctionne, si la table existe dans la base de données cible, vous obtiendrez un message d'erreur, mais les données seront copiées.
Vincnetas
3
@MartinMeeser dans la version de SQLite que j'ai installée (v3.19.3), .dumpcrée la commande CREATE TABLE IF NOT EXISTS ..., et il n'y a aucune erreur même si ma table de destination existe.
Ingénieur inversé le
1
Un moyen simple et convivial pour résoudre le problème. Vous méritez mon vote positif. Je vous remercie!
Augusto Destrero
10

Pour une action ponctuelle, vous pouvez utiliser .dump et .read.

Vider 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

Lisez le vidage dans le fichier new_db.sqlite en supposant que la table n'existe pas

c:\sqlite>sqlite3.exe new_db.sqlite
sqlite> .read mytable_dump.sql

Vous avez maintenant cloné votre table. Pour ce faire pour toute la base de données, omettez simplement le nom de la table dans la commande .dump.

Bonus: les bases de données peuvent avoir différents encodages.

Thinkeye
la source
7

Code Objective-C pour copier une 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);
        }
 }
Avinash
la source
0

J'avais besoin de déplacer des données d'une base de données compacte de serveur sql vers sqlite, donc en utilisant sql server 2008, vous pouvez faire un clic droit sur la table et sélectionner «Script Table To» puis «Data to Inserts». Copiez les instructions d'insertion supprimez les instructions 'GO' et elles ont été exécutées avec succès lorsqu'elles sont appliquées à la base de données sqlite à l'aide de l'application 'DB Browser for Sqlite'.

Michael Gabay
la source
0

Premier scénario: DB1.sqlite et DB2.sqlite ont la même table (t1), mais DB1 est plus «à jour» que DB2. Si elle est petite, 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 grande table, vous serez peut-être mieux avec une INSERT if not existssolution de type. Si vous avez une Unique Keycolonne, c'est plus simple, sinon vous devrez utiliser une combinaison de champs (peut-être tous les champs) et à un moment donné, il est encore plus rapide de simplement dropet de remettre createla table; c'est toujours plus simple (moins de réflexion requise).


LA CONFIGURATION: ouvrir SQLite sans DB qui crée une base de données temporaryen mémoire main, puis attachDB1.sqlite et DB2.sqlite

> sqlite3
sqlite> ATTACH "DB1.sqlite" AS db1
sqlite> ATTACH "DB2.sqlite" AS db2

et utilisez .databasespour voir les bases de données jointes et leurs fichiers.

sqlite> .databases
main: 
db1: /db/DB1.sqlite
db2: /db/DB2.sqlite
Capable Mac
la source
REMARQUE: Cela ne préserve pas les attributs UNIQUEet PRIMARY KEY, donc si vous en avez, vous devrez soit DROP TABLEet manuellement CREATEet / INSERTou utiliser la méthode.dump et .read mentionnée ci-dessus par @Thinkeye.
Able Mac