Копирование данных из одной базы данных SQLite в другой
У меня есть 2 базы данных SQLite с общими данными, но с разными целями, и я хотел избежать повторной вставки данных, поэтому мне было интересно, можно ли скопировать всю таблицу из одной базы данных в другую?
6 ответов
вам придется присоединить базу данных X с базой данных Y, используя прикрепить command, затем запустите соответствующую команду Insert Into для таблиц, которые вы хотите перенести.
INSERT INTO X.TABLE SELECT * FROM Y.TABLE;
или, если столбцы не совпадают по порядку:
INSERT INTO X.TABLE(fieldname1, fieldname2) SELECT fieldname1, fieldname2 FROM Y.TABLE;
Рассмотрим пример, где у меня есть две базы данных, а именно allmsa.дБ и Атланта.децибел. Скажем, база данных allmsa.db имеет таблицы для всех msas в США и базе данных atlanta.db пуст.
наша цель-скопировать таблицу atlanta из allmsa.дБ в Атланту.децибел.
шаги
- sqlite3 для Атланта.db (перейти в базу данных atlanta)
- прикрепить allmsa.децибел. Это можно сделать с помощью команды
ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM;
обратите внимание, что мы даем весь путь к базе данных быть прикрепленным. - проверьте список базы данных с помощью
sqlite> .databases
вы можете увидеть вывод как
seq name file --- --------------- ---------------------------------------------------------- 0 main /mnt/fastaccessDS/core/csv/atlanta.db 2 AM /mnt/fastaccessDS/core/csv/allmsa.db
- теперь вы подошли к своей фактической цели. Использовать команду
INSERT INTO atlanta SELECT * FROM AM.atlanta;
это должно служить вашей цели.
самый простой и правильный способ в одну строку:
sqlite3 old.db ".dump mytable" | sqlite3 new.db
первичный ключ и типы столбцов будут сохранены.
на один прием, можно использовать .свалка и. читать.
дамп таблицы my_table из old_db.SQLite в
c:\sqlite>sqlite3.exe old_db.sqlite
sqlite> .output mytable_dump.sql
sqlite> .dump my_table
sqlite> .quit
прочитайте дамп в new_db.SQLite предполагая, что таблица там не существует
c:\sqlite>sqlite3.exe new_db.sqlite
sqlite> .read mytable_dump.sql
теперь вы клонировали свой стол. Чтобы сделать это для всей базы данных, просто оставьте имя таблицы в поле .команда dump.
бонус: базы данных могут иметь различные кодировки.
Objective-C код для копирования таблицы из базы данных в другую базу данных
-(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);
}
}
Мне нужно было переместить данные из базы данных SQL server compact в sqlite, поэтому с помощью sql server 2008 Вы можете щелкнуть правой кнопкой мыши по таблице и выбрать "таблица скриптов", а затем "данные для вставок". Скопируйте инструкции insert удалите инструкции "GO", и они успешно выполняются при применении к базе данных sqlite с помощью приложения "DB Browser for Sqlite".