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?
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?
Réponses:
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;
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 la sortie commefichier de nom seq --- --------------- -------------------------------- -------------------------- 0 principal /mnt/fastaccessDS/core/csv/atlanta.db 2 h 00 /mnt/fastaccessDS/core/csv/allmsa.db
INSERT INTO atlanta SELECT * FROM AM.atlanta;
Cela devrait servir votre objectif.
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.
.dump
crée la commande CREATE TABLE IF NOT EXISTS ...
, et il n'y a aucune erreur même si ma table de destination existe.
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.
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);
}
}
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'.
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 exists
solution de type. Si vous avez une Unique Key
colonne, 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 drop
et de remettre create
la 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 temporary
en mémoire main
, puis attach
DB1.sqlite et DB2.sqlite
> sqlite3
sqlite> ATTACH "DB1.sqlite" AS db1
sqlite> ATTACH "DB2.sqlite" AS db2
et utilisez .databases
pour voir les bases de données jointes et leurs fichiers.
sqlite> .databases
main:
db1: /db/DB1.sqlite
db2: /db/DB2.sqlite
UNIQUE
et PRIMARY KEY
, donc si vous en avez, vous devrez soit DROP TABLE
et manuellement CREATE
et / INSERT
ou utiliser la méthode.dump
et .read
mentionnée ci-dessus par @Thinkeye.