Ortak verilerle ama farklı amaçlarla 2 SQLite veritabanları var ve verileri yeniden yerleştirmekten kaçınmak istedim, bu yüzden tüm tabloyu bir veritabanından diğerine kopyalamanın mümkün olup olmadığını merak ediyordum?
Ortak verilerle ama farklı amaçlarla 2 SQLite veritabanları var ve verileri yeniden yerleştirmekten kaçınmak istedim, bu yüzden tüm tabloyu bir veritabanından diğerine kopyalamanın mümkün olup olmadığını merak ediyordum?
Yanıtlar:
ATTACH komutunu kullanarak Database X'i Database Y ile eklemeniz , ardından aktarmak istediğiniz tablolar için uygun Insert Into komutlarını çalıştırmanız gerekir.
INSERT INTO X.TABLE SELECT * FROM Y.TABLE;
Veya sütunlar sırayla eşleşmezse:
INSERT INTO X.TABLE(fieldname1, fieldname2) SELECT fieldname1, fieldname2 FROM Y.TABLE;
Allmsa.db ve atlanta.db adlı iki veritabanımın olduğu bir örneği ele alalım. Allmsa.db veritabanının ABD'deki tüm MSA'lar için tabloları olduğunu ve atlanta.db veritabanı boş olduğunu varsayalım.
Hedefimiz atlanta tablosunu allmsa.db'den atlanta.db'ye kopyalamaktır.
ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM;
veritabanının tüm yolunu verdiğimiz komut notu kullanılarak yapılabilir .sqlite> .databases
çıktısını görmek için kullanarak veritabanı listesini kontrol edinsıra ad dosyası --- --------------- -------------------------------- -------------------------- 0 ana /mnt/fastaccessDS/core/csv/atlanta.db 02:00 / mnt/fastaccessDS/core/csv/allmsa.db
INSERT INTO atlanta SELECT * FROM AM.atlanta;
Bu sizin amacınıza hizmet etmelidir.
Tek bir hat üzerinde en kolay ve doğru yol:
sqlite3 old.db ".dump mytable" | sqlite3 new.db
Birincil anahtar ve sütun türleri korunacaktır.
.dump
komutu oluşturur ve hedef tablom CREATE TABLE IF NOT EXISTS ...
olmasına rağmen hata yok.
Bir kerelik işlem için .dump ve .read kullanabilirsiniz.
My_table tablosunu old_db.sqlite sayfasından dök
c:\sqlite>sqlite3.exe old_db.sqlite
sqlite> .output mytable_dump.sql
sqlite> .dump my_table
sqlite> .quit
Tablonun mevcut olmadığını varsayarak new_db.sqlite dosyasına dökümü okuyun
c:\sqlite>sqlite3.exe new_db.sqlite
sqlite> .read mytable_dump.sql
Şimdi masanızı klonladınız. Tüm veritabanı için bunu yapmak için, tablo adını .dump komutunda bırakmanız yeterlidir.
Bonus: Veritabanları farklı kodlamalara sahip olabilir.
Tabloyu bir veritabanından başka bir veritabanına kopyalamak için Objective-C kodu
-(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);
}
}
Bir sql server kompakt veritabanından sqlite veri taşımak gerekiyordu, bu yüzden sql server 2008 kullanarak masaya sağ tıklayın ve 'Komut Dosyası Tablosu' ve sonra 'Veri Ekler' seçin. Insert deyimlerini kopyalayın 'GO' deyimlerini kaldırın ve sqlite veritabanına uygulandığında 'Sqlite için DB Tarayıcısı' uygulaması kullanılarak başarıyla yürütüldü.
İlk senaryo: DB1.sqlite ve DB2.sqlite aynı tabloya (t1) sahiptir, ancak DB1, DB2'den daha "güncel" dir. Küçükse, tabloyu DB2'den bırakın ve verilerle yeniden oluşturun:
> DROP TABLE IF EXISTS db2.t1; CREATE TABLE db2.t1 AS SELECT * FROM db1.t1;
İkinci senaryo: Büyük bir tabloysa, bir INSERT if not exists
tür çözümle daha iyi olabilirsiniz . Eğer bir varsa Unique Key
sütun aksi takdirde (belki her alanda) alanların bir arada kullanmak gerekirdi daha yalındır olduğunu ve bir noktada sadece hala daha hızlıdır drop
ve yeniden create
tablo; her zaman daha basittir (daha az düşünmek gerekir).
AYAR: DB olmadan açık SQLite bir oluşturur temporary
bellek içinde main
, veritabanı sonra attach
DB1.sqlite ve DB2.sqlite
> sqlite3
sqlite> ATTACH "DB1.sqlite" AS db1
sqlite> ATTACH "DB2.sqlite" AS db2
ve .databases
ekli veritabanlarını ve dosyalarını görmek için kullanın .
sqlite> .databases
main:
db1: /db/DB1.sqlite
db2: /db/DB2.sqlite
UNIQUE
ve PRIMARY KEY
nitelikleri, o varsa o kadar, ya gerekir DROP TABLE
elle ve CREATE
ve INSERT
ya kullanmak .dump
ve .read
yukarıda bahsedilen yöntemi @Thinkeye tarafından.