Копіювання даних з однієї бази даних SQLite в іншу


141

У мене є 2 бази даних SQLite із загальними даними, але з різною метою, і я хотів уникнути повторного вставки даних, тому мені було цікаво, чи можна скопіювати цілу таблицю з однієї бази даних в іншу?

Відповіді:


171

Вам доведеться приєднати Базу даних X із базою даних Y за допомогою команди ATTACH , а потім запустити відповідні команди Вставити в таблицю, які потрібно перенести.

INSERT INTO X.TABLE SELECT * FROM Y.TABLE;

Або якщо стовпці не зібрані в порядку:

INSERT INTO X.TABLE(fieldname1, fieldname2) SELECT fieldname1, fieldname2 FROM Y.TABLE;

1
Також якщо використовується програма SQLite Expert Personal, вона дає можливість правою кнопкою миші та баз даних ATTACH
mehmet

6
Спершу потрібно створити таблицю!
Кріс Луенго

55

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

Наша мета - скопіювати таблицю атланти з allmsa.db в atlanta.db.

Кроки

  1. sqlite3 atlanta.db (для переходу в базу даних Атланти)
  2. Прикріпити allmsa.db. Це можна зробити, скориставшись командою ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM; зауваження, що ми надаємо весь шлях до бази даних, що додається.
  3. Перевірте список баз даних, використовуючи sqlite> .databases ви можете бачити вихід
файл послідовного імені                                                      
--- --------------- -------------------------------- --------------------------
0 головний /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;' переплутав речі. Він скопіював усі дані, але деякі поля були замінені! Не використовуйте його. Замість цього скористайтеся командою з прийнятої відповіді, або ще більш явно: "ВСТАВИТЬ У X.TABLE (Id, Значення) SELECT Id, значення від Y.TABLE; для мене це спрацювало чудово.
Карім Сонбол,

@KarimSonbol Єдина відмінність полягає в тому, що в прийнятій відповіді передача виконується Із базової бази даних, до якої ви додаєте базу даних, тоді як у цій відповіді навпаки.
Tulains Córdova

@ TulainsCórdova: Прийнята відповідь (останній варіант) передбачає, що вона відрізняється тим, що вона працює навіть тоді, коли "стовпці не узгоджуються по порядку". Ти кажеш, що це неправда?
LarsH

52

Найпростіший і правильний спосіб на одному рядку:

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 ..., і помилок немає, хоча моя таблиця призначення існує.
інженерів

1
Простий, UNIX дружній спосіб вирішити проблему. Ви заслужили мою нагороду. Дякую!
Augusto Destrero

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.

Бонус: Бази даних можуть мати різні кодування.


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

0

Мені потрібно було перемістити дані з компактної бази даних сервера sql в sqlite, тому, використовуючи sql-сервер 2008, ви можете правою кнопкою миші натиснути таблицю і вибрати "Таблиця сценаріїв", а потім "Дані вставки". Скопіюйте оператори вставлення, видаліть оператори «GO», і вони успішно виконуються при застосуванні до бази даних sqlite за допомогою програми «Оглядач БД для Sqlite».


0

Перший сценарій: 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

Примітка: Це не зберігає UNIQUEі PRIMARY KEYатрибути, так що якщо у вас є ті, вам необхідно або DROP TABLEвручну CREATEі INSERTчи використовувати .dumpі .read метод , згаданий вище за @Thinkeye.
Able Mac
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.