Menyalin data dari satu database SQLite ke yang lain

141

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?

Leonardo Marques
sumber

Jawaban:

171

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;
Michael D. Irizarry
sumber
1
Juga jika program Pribadi SQLite Pakai menggunakan, itu memberi kesempatan untuk klik kanan dan ATTACH database
mehmet
6
Anda harus membuat tabel terlebih dahulu!
Cris Luengo
55

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.

Langkah

  1. sqlite3 atlanta.db (untuk masuk ke database atlanta)
  2. Lampirkan allmsa.db. Ini dapat dilakukan dengan menggunakan ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM; catatan perintah yang kami berikan seluruh path dari database untuk dilampirkan.
  3. periksa daftar database menggunakan sqlite> .databases Anda dapat melihat output sebagai
file nama seq                                                      
--- --------------- -------------------------------- --------------------------
0 main /mnt/fastaccessDS/core/csv/atlanta.db                  
2 pagi / mnt/fastaccessDS/core/csv/allmsa.db 
  1. sekarang Anda sampai pada target Anda yang sebenarnya. Gunakan perintah INSERT INTO atlanta SELECT * FROM AM.atlanta;

Ini harus memenuhi tujuan Anda.

Neeraj Chandak
sumber
2
Menggunakan 'INSERT INTO atlanta SELECT * FROM AM.atlanta;' hal-hal yang kacau. Itu menyalin semua data tetapi beberapa bidang ditukar! Jangan gunakan itu. Alih-alih gunakan perintah dari jawaban yang diterima, atau bahkan lebih eksplisit: "Masukkan ke X.TABEL (Id, Nilai) SELECT Id, Nilai DARI Y.TABEL; Ini bekerja dengan baik untuk saya.
Karim Sonbol
@KarimSonbol Satu-satunya perbedaan adalah bahwa dalam transfer jawaban yang diterima dilakukan DARI database Anda, KE database terlampir, sedangkan dalam jawaban ini adalah sebaliknya.
Tulains Córdova
@ TulainsCórdova: Jawaban yang diterima (varian terakhir) menyiratkan bahwa ia berbeda karena berfungsi bahkan ketika "kolom tidak cocok secara berurutan." Apakah Anda mengatakan itu tidak benar?
LarsH
52

Cara termudah dan benar dalam satu baris:

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

Kunci utama dan jenis kolom akan disimpan.

Bernardo Ramos
sumber
1
Ini agak jelas ... tetapi jika sudah ada tabel dengan nama itu di database target, itu tidak mungkin. Jadi tidak mungkin untuk menambahkan data yang sudah ada dengan solusi itu (kecuali sebaliknya)
Martin Meeser
@ MartinMeeser Pertanyaannya adalah tentang menyalin tabel bukan menggabungkan tabel. Anda dapat mencoba untuk menggabungkan dengan membuang ke file sementara, mengedit file menghapus pernyataan CREATE TABLE dan menggunakan file sementara sebagai input untuk new.db. Tetapi konflik pada kunci primer dapat terjadi
Bernardo Ramos
@ MartinMeeser, sebenarnya menggabungkan karya, jika tabel ada di target DB Anda akan mendapatkan pesan kesalahan, tetapi data akan disalin.
Vincnetas
3
@ MartinMeeser dalam versi SQLite yang telah saya instal (v3.19.3), .dumpmenciptakan perintah CREATE TABLE IF NOT EXISTS ..., dan tidak ada kesalahan meskipun tabel tujuan saya ada.
Insinyur Terbalik
1
Cara sederhana, ramah UNIX untuk menyelesaikan masalah. Anda layak mendapat dukungan saya. Terima kasih!
Augusto Destrero
9

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.

Thinkeye
sumber
7

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

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'.

Michael Gabay
sumber
0

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
Mampu Mac
sumber
CATATAN: Ini tidak mempertahankan 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.
Mampu Mac