Копирование данных из одной базы данных SQLite в другую

143

У меня есть 2 базы данных SQLite с общими данными, но с разными целями, и я хотел избежать повторной вставки данных, поэтому мне было интересно, можно ли скопировать всю таблицу из одной базы данных в другую?

Леонардо Маркес
источник

Ответы:

177

Вам нужно будет присоединить базу данных 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;
Майкл Д. Иризарри
источник
1
Также, если используется программа SQLite Expert Personal, она дает возможность щелкнуть правой кнопкой мыши и ПРИКЛЮЧИТЬ базы данных
мехмет
6
Сначала вам нужно создать таблицу!
Крис Луенго
55

Рассмотрим пример, в котором у меня есть две базы данных, а именно allmsa.db и atlanta.db. Скажем, в базе данных allmsa.db есть таблицы для всех msas в США, а база данных atlanta.db пуста.

Наша цель - скопировать таблицу atlanta из allmsa.db в atlanta.db.

Шаги

  1. sqlite3 atlanta.db (для входа в базу данных atlanta)
  2. Прикрепите allmsa.db. Это можно сделать с помощью команды ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM; note, в которой мы указываем полный путь к присоединяемой базе данных.
  3. проверьте список базы данных, используя sqlite> .databases вы можете увидеть результат как
файл имени seq                                                      
--- --------------- -------------------------------- --------------------------
0 основной /mnt/fastaccessDS/core/csv/atlanta.db                  
2 часа ночи /mnt/fastaccessDS/core/csv/allmsa.db 
  1. теперь вы подошли к своей реальной цели. Используйте команду INSERT INTO atlanta SELECT * FROM AM.atlanta;

Это должно служить вашей цели.

Нирадж Чандак
источник
4
Используя 'INSERT INTO atlanta SELECT * FROM AM.atlanta;' напутал вещи. Он скопировал все данные, но некоторые поля поменялись местами! Не используйте это. Вместо того, чтобы использовать команду из принятого ответа, или даже более явно:. «INSERT INTO X.TABLE (Id, Value) ВЫБРАТЬ Id, значение ОТ Y.TABLE, это работало отлично для меня
Карим Sonbol
@KarimSonbol Единственное отличие состоит в том, что в принятом ответе передача выполняется ИЗ базы данных, в которой вы находитесь, В присоединенную базу данных, тогда как в этом ответе все наоборот.
Tulains Córdova
@ TulainsCórdova: принятый ответ (последний вариант) подразумевает, что он отличается тем, что работает, даже когда «столбцы не совпадают по порядку». Вы говорите, что это неправда?
LarsH
53

Самый простой и правильный способ в одну строку:

sqlite3 old.db ".dump mytable" | sqlite3 new.db

Первичный ключ и типы столбцов будут сохранены.

Бернардо Рамос
источник
1
Это очевидно ... но если в целевой базе данных уже есть таблица с таким именем, это невозможно. Таким образом, с помощью этого решения невозможно добавить к уже существующим данным (в противном случае отлично),
Мартин Мизер
@MartinMeeser Речь идет о копировании таблицы, а не слиянии таблиц. Вы можете попытаться выполнить слияние, сделав дамп во временный файл, отредактировав файл, удалив оператор CREATE TABLE и используя временный файл в качестве входных данных для new.db. Но могут возникать конфликты по первичному ключу
Бернардо Рамос
@MartinMeeser, на самом деле слияние работает, если таблица существует в целевой БД, вы получите сообщение об ошибке, но данные будут скопированы.
Vincnetas
3
@MartinMeeser в версии SQLite, которую я установил (v3.19.3), .dumpсоздает команду CREATE TABLE IF NOT EXISTS ..., и ошибки нет, даже если моя таблица назначения существует.
Reversed Engineer
1
Простой, удобный для UNIX способ решения проблемы. Вы заслуживаете моего одобрения. Спасибо!
Аугусто Дестреро,
10

Для одноразового действия вы можете использовать .dump и .read.

Дамп таблицы 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.

Бонус: базы данных могут иметь разные кодировки.

Thinkeye
источник
7

Код 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);
        }
 }
Авинаш
источник
1

Первый сценарий: 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, затем attachDB1.sqlite и DB2.sqlite

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

и используйте .databasesдля просмотра прикрепленных баз данных и их файлов.

sqlite> .databases
main: 
db1: /db/DB1.sqlite
db2: /db/DB2.sqlite
Able Mac
источник
Примечание: Это не сохраняет UNIQUEи PRIMARY KEYатрибуты, так что если у вас есть те, вам необходимо либо DROP TABLEвручную CREATEи INSERTили использовать .dumpи .read метод , упомянутый выше по @Thinkeye.
Able Mac
0

Мне нужно было переместить данные из компактной базы данных sql server в sqlite, поэтому, используя sql server 2008, вы можете щелкнуть правой кнопкой мыши по таблице и выбрать «Script Table To», а затем «Data to Inserts». Скопируйте операторы вставки, удалите операторы GO, и они успешно выполнятся при применении к базе данных sqlite с помощью приложения DB Browser for Sqlite.

Майкл Габай
источник
0

Если вы используете DB Browser для SQLite , вы можете скопировать таблицу из одной базы данных в другую, выполнив следующие действия:

  1. Откройте два экземпляра приложения и загрузите исходную и целевую базы данных бок о бок.
  2. Если в целевой базе данных нет таблицы, «Скопируйте оператор создания» из исходной базы данных, а затем вставьте оператор sql на вкладку «Выполнение SQL» и запустите sql для создания таблицы.
  3. В исходной базе данных экспортируйте таблицу как файл CSV.
  4. В целевой базе данных импортируйте файл CSV в таблицу с тем же именем. Приложение спросит, хотите ли вы импортировать данные в существующую таблицу, нажмите «Да». Выполнено.
Jfly
источник