У мене є 2 бази даних SQLite із загальними даними, але з різною метою, і я хотів уникнути повторного вставки даних, тому мені було цікаво, чи можна скопіювати цілу таблицю з однієї бази даних в іншу?
У мене є 2 бази даних SQLite із загальними даними, але з різною метою, і я хотів уникнути повторного вставки даних, тому мені було цікаво, чи можна скопіювати цілу таблицю з однієї бази даних в іншу?
Відповіді:
Вам доведеться приєднати Базу даних X із базою даних Y за допомогою команди ATTACH , а потім запустити відповідні команди Вставити в таблицю, які потрібно перенести.
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 порожня.
Наша мета - скопіювати таблицю атланти з allmsa.db в atlanta.db.
ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM;
зауваження, що ми надаємо весь шлях до бази даних, що додається.sqlite> .databases
ви можете бачити вихідфайл послідовного імені --- --------------- -------------------------------- -------------------------- 0 головний /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
Первинний ключ та типи стовпців зберігатимуться.
.dump
створює команду CREATE TABLE IF NOT EXISTS ...
, і помилок немає, хоча моя таблиця призначення існує.
За один час дії можна використовувати .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.
Бонус: Бази даних можуть мати різні кодування.
Код 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 в sqlite, тому, використовуючи sql-сервер 2008, ви можете правою кнопкою миші натиснути таблицю і вибрати "Таблиця сценаріїв", а потім "Дані вставки". Скопіюйте оператори вставлення, видаліть оператори «GO», і вони успішно виконуються при застосуванні до бази даних sqlite за допомогою програми «Оглядач БД для Sqlite».
Перший сценарій: 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
> 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.