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

106

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

Теги:
database
sqlite3

6 ответов

135
Лучший ответ

Вам нужно будет привязать базу данных 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;
  • 8
    Это работает, только если обе базы данных имеют одинаковую кодировку.
  • 0
    Также, если используется программа SQLite Expert Personal, она дает возможность щелкнуть правой кнопкой мыши и базы данных ATTACH.
Показать ещё 1 комментарий
47

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

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

Действия

  • sqlite3 atlanta.db(чтобы войти в базу данных atlanta)
  • Прикрепить allmsa.db. Это можно сделать, используя команду 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 
  1. теперь вы попадаете в свою реальную цель. Используйте команду INSERT INTO atlanta SELECT * FROM AM.atlanta;

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

  • 2
    Использование 'INSERT INTO atlanta SELECT * FROM AM.atlanta;' испортил вещи. Он скопировал все данные, но некоторые поля были поменяны местами! Не используйте это. Вместо этого используйте команду из принятого ответа, или даже более явно: "INSERT INTO X.TABLE (Id, Value) SELECT Id, Value FROM Y.TABLE; для меня это работало нормально.
  • 0
    @KarimSonbol Единственное отличие состоит в том, что в принятом ответе передача выполняется из базы данных, в которой вы находитесь, в присоединенную базу данных, тогда как в этом ответе все наоборот.
Показать ещё 1 комментарий
23

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

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

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

  • 1
    Это довольно очевидно ... но если в целевой базе данных уже есть таблица с таким именем, это невозможно. Таким образом, невозможно добавить к уже существующим данным с этим решением (отличный вариант)
  • 0
    @MartinMeeser Вопрос в том, чтобы скопировать таблицу, а не объединить таблицы. Вы можете попытаться выполнить слияние, выполнив дамп во временный файл, отредактировав файл, удалив оператор CREATE TABLE и используя временный файл в качестве входных данных для new.db. Но могут возникнуть конфликты по первичному ключу
Показать ещё 1 комментарий
7

Для одноразового действия вы можете использовать .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.

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

4

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);
        }
 }
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню