Saya memiliki 2 database SQLite dengan data umum tetapi dengan tujuan berbeda dan saya ingin menghindari memasukkan kembali data, jadi saya bertanya-tanya apakah mungkin untuk menyalin seluruh tabel dari satu database ke yang lain?
Saya memiliki 2 database SQLite dengan data umum tetapi dengan tujuan berbeda dan saya ingin menghindari memasukkan kembali data, jadi saya bertanya-tanya apakah mungkin untuk menyalin seluruh tabel dari satu database ke yang lain?
Jawaban:
Anda harus melampirkan Database X dengan Database Y menggunakan perintah ATTACH , kemudian jalankan perintah Insert Into yang sesuai untuk tabel yang ingin Anda transfer.
INSERT INTO X.TABLE SELECT * FROM Y.TABLE;
Atau, jika kolom tidak cocok secara berurutan:
INSERT INTO X.TABLE(fieldname1, fieldname2) SELECT fieldname1, fieldname2 FROM Y.TABLE;
Perhatikan contoh di mana saya memiliki dua database yaitu allmsa.db dan atlanta.db. Katakanlah database allmsa.db memiliki tabel untuk semua msas di AS dan database atlanta.db kosong.
Target kami adalah menyalin tabel atlanta dari allmsa.db ke atlanta.db.
ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM;
catatan perintah yang kami berikan seluruh path dari database untuk dilampirkan.sqlite> .databases
Anda dapat melihat output sebagaifile nama seq --- --------------- -------------------------------- -------------------------- 0 main /mnt/fastaccessDS/core/csv/atlanta.db 2 pagi / mnt/fastaccessDS/core/csv/allmsa.db
INSERT INTO atlanta SELECT * FROM AM.atlanta;Ini harus memenuhi tujuan Anda.
Cara termudah dan benar dalam satu baris:
sqlite3 old.db ".dump mytable" | sqlite3 new.db
Kunci utama dan jenis kolom akan disimpan.
.dumpmenciptakan perintah CREATE TABLE IF NOT EXISTS ..., dan tidak ada kesalahan meskipun tabel tujuan saya ada.
Untuk tindakan satu kali, Anda dapat menggunakan .dump dan .read.
Buang tabel my_table dari old_db.sqlite
c:\sqlite>sqlite3.exe old_db.sqlite
sqlite> .output mytable_dump.sql
sqlite> .dump my_table
sqlite> .quit
Baca dump ke new_db.sqlite dengan asumsi tabel di sana tidak ada
c:\sqlite>sqlite3.exe new_db.sqlite
sqlite> .read mytable_dump.sql
Sekarang Anda telah mengkloning meja Anda. Untuk melakukan ini untuk seluruh database, cukup tinggalkan nama tabel di perintah .dump.
Bonus: Basis data dapat memiliki penyandian yang berbeda.
Kode objektif-C untuk menyalin Tabel dari Database ke Database lain
-(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);
}
}
Saya perlu memindahkan data dari database sql server ke sqlite, jadi dengan menggunakan sql server 2008 Anda dapat mengklik kanan pada tabel dan memilih 'Script Table To' dan kemudian 'Data to Inserts'. Salin pernyataan yang disisipkan menghapus pernyataan 'GO' dan berhasil dieksekusi ketika diterapkan ke database sqlite menggunakan aplikasi 'DB Browser for Sqlite'.
Skenario pertama: DB1.sqlite dan DB2.sqlite memiliki tabel yang sama (t1), tetapi DB1 lebih "up to date" daripada DB2. Jika kecil, letakkan tabel dari DB2 dan buat kembali dengan data:
> DROP TABLE IF EXISTS db2.t1; CREATE TABLE db2.t1 AS SELECT * FROM db1.t1;
Skenario kedua: Jika tabel besar, Anda mungkin lebih baik dengan INSERT if not existssolusi tipe. Jika Anda memiliki Unique Keykolom itu lebih lurus ke depan, jika tidak, Anda harus menggunakan kombinasi bidang (mungkin setiap bidang) dan pada titik tertentu itu masih lebih cepat untuk hanya dropdan kembali createtabel; selalu lebih lurus ke depan (lebih sedikit pemikiran diperlukan).
PENGATURAN: buka SQLite tanpa DB yang membuat basis data temporarydi memori main, lalu attachDB1.sqlite dan DB2.sqlite
> sqlite3
sqlite> ATTACH "DB1.sqlite" AS db1
sqlite> ATTACH "DB2.sqlite" AS db2
dan gunakan .databasesuntuk melihat database terlampir dan file-file mereka.
sqlite> .databases
main:
db1: /db/DB1.sqlite
db2: /db/DB2.sqlite
UNIQUEdan PRIMARY KEYatribut, jadi jika Anda memilikinya, Anda harus DROP TABLEdan secara manual CREATEdan INSERTatau menggunakan metode.dump dan .read yang disebutkan di atas oleh @Thinkeye.