У меня есть 2 базы данных SQLite с общими данными, но с разными целями, и я хотел избежать повторной вставки данных, поэтому мне было интересно, можно ли скопировать всю таблицу из одной базы данных в другую?
143
Вам нужно будет присоединить базу данных X к базе данных Y с помощью команды ATTACH , а затем выполнить соответствующие команды Insert Into для таблиц, которые вы хотите передать.
INSERT INTO X.TABLE SELECT * FROM Y.TABLE;
Или, если столбцы не совпадают по порядку:
INSERT INTO X.TABLE(fieldname1, fieldname2) SELECT fieldname1, fieldname2 FROM Y.TABLE;
Рассмотрим пример, в котором у меня есть две базы данных, а именно allmsa.db и atlanta.db. Скажем, в базе данных allmsa.db есть таблицы для всех msas в США, а база данных atlanta.db пуста.
Наша цель - скопировать таблицу atlanta из allmsa.db в atlanta.db.
Шаги
ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM;
note, в которой мы указываем полный путь к присоединяемой базе данных.sqlite> .databases
вы можете увидеть результат какINSERT INTO atlanta SELECT * FROM AM.atlanta;
Это должно служить вашей цели.
источник
Самый простой и правильный способ в одну строку:
Первичный ключ и типы столбцов будут сохранены.
источник
.dump
создает командуCREATE TABLE IF NOT EXISTS ...
, и ошибки нет, даже если моя таблица назначения существует.Для одноразового действия вы можете использовать .dump и .read.
Дамп таблицы my_table из old_db.sqlite
Прочтите дамп в new_db.sqlite, предполагая, что таблица там не существует
Теперь вы клонировали свою таблицу. Чтобы сделать это для всей базы данных, просто не указывайте имя таблицы в команде .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); } }
источник
Первый сценарий: DB1.sqlite и DB2.sqlite имеют одну и ту же таблицу (t1), но DB1 более "актуален", чем DB2. Если она небольшая, удалите таблицу из DB2 и заново создайте ее с данными:
> DROP TABLE IF EXISTS db2.t1; CREATE TABLE db2.t1 AS SELECT * FROM db1.t1;
Второй сценарий: если это большая таблица, вам может быть лучше использовать
INSERT if not exists
типовое решение. Если у вас естьUnique Key
столбец, это более просто, иначе вам нужно будет использовать комбинацию полей (возможно, каждое поле), и в какой-то момент все еще быстрее простоdrop
и повторноcreate
таблица; это всегда более прямолинейно (требуется меньше размышлений).НАСТРОЙКА: откройте SQLite без БД, которая создает базу данных
temporary
в памятиmain
, затемattach
DB1.sqlite и DB2.sqliteи используйте
.databases
для просмотра прикрепленных баз данных и их файлов.источник
UNIQUE
иPRIMARY KEY
атрибуты, так что если у вас есть те, вам необходимо либоDROP TABLE
вручнуюCREATE
иINSERT
или использовать.dump
и.read
метод , упомянутый выше по @Thinkeye.Мне нужно было переместить данные из компактной базы данных sql server в sqlite, поэтому, используя sql server 2008, вы можете щелкнуть правой кнопкой мыши по таблице и выбрать «Script Table To», а затем «Data to Inserts». Скопируйте операторы вставки, удалите операторы GO, и они успешно выполнятся при применении к базе данных sqlite с помощью приложения DB Browser for Sqlite.
источник
Если вы используете DB Browser для SQLite , вы можете скопировать таблицу из одной базы данных в другую, выполнив следующие действия:
источник