Sao chép dữ liệu từ cơ sở dữ liệu SQLite này sang cơ sở dữ liệu khác


141

Tôi có 2 cơ sở dữ liệu SQLite với dữ liệu chung nhưng với các mục đích khác nhau và tôi muốn tránh nhập lại dữ liệu, vì vậy tôi tự hỏi liệu có thể sao chép toàn bộ bảng từ cơ sở dữ liệu này sang cơ sở dữ liệu khác không?

Câu trả lời:


170

Bạn sẽ phải đính kèm Cơ sở dữ liệu X với Cơ sở dữ liệu Y bằng lệnh ATTACH , sau đó chạy các lệnh Chèn vào thích hợp cho các bảng bạn muốn chuyển.

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

Hoặc, nếu các cột không khớp nhau theo thứ tự:

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

1
Ngoài ra, nếu chương trình Cá nhân Chuyên gia SQLite đang sử dụng, nó sẽ tạo cơ hội nhấp chuột phải và cơ sở dữ liệu ATTACH
mehmet

6
Bạn cần tạo bảng trước!
Cris Luengo

55

Hãy xem xét một ví dụ nơi tôi có hai cơ sở dữ liệu là allmsa.db và atlanta.db. Giả sử cơ sở dữ liệu allmsa.db có các bảng cho tất cả msas ở Hoa Kỳ và cơ sở dữ liệu atlanta.db trống.

Mục tiêu của chúng tôi là sao chép bảng atlanta từ allmsa.db sang atlanta.db.

Các bước

  1. sqlite3 atlanta.db (để đi vào cơ sở dữ liệu atlanta)
  2. Đính kèm allmsa.db. Điều này có thể được thực hiện bằng cách sử dụng ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM; ghi chú lệnh mà chúng tôi cung cấp cho toàn bộ đường dẫn của cơ sở dữ liệu được đính kèm.
  3. kiểm tra danh sách cơ sở dữ liệu bằng cách sử dụng sqlite> .databases bạn có thể thấy đầu ra như
tập tin tên seq                                                      
--- --------------- -------------------------------- --------------------------
0 chính /mnt/fastaccessDS/core/csv/atlanta.db                  
2 giờ sáng / mnt / fastaccessDS / core / csv / allmsa.db 
  1. bây giờ bạn đến mục tiêu thực tế của bạn. Sử dụng lệnh INSERT INTO atlanta SELECT * FROM AM.atlanta;

Điều này sẽ phục vụ mục đích của bạn.


2
Sử dụng 'CHERTN VÀO atlanta CHỌN * TỪ AM.atlanta;' làm mọi thứ rối tung lên Nó sao chép tất cả dữ liệu nhưng một số trường đã bị tráo đổi! Đừng sử dụng nó. Thay vì sử dụng lệnh từ câu trả lời được chấp nhận, hoặc thậm chí một cách rõ ràng hơn: ". INSERT INTO X.TABLE (Id, giá trị gia tăng) Id SELECT, giá trị gia tăng TỪ Y.TABLE; này tốt làm việc cho tôi
Karim Sonbol

@KarimSonbol Sự khác biệt duy nhất là trong chuyển câu trả lời được chấp nhận được thực hiện TỪ cơ sở dữ liệu bạn vào, đến cơ sở dữ liệu đính kèm, trong khi trong câu trả lời này là cách khác.
Tulains Córdova

@ TulainsCórdova: Câu trả lời được chấp nhận (biến thể cuối cùng) ngụ ý rằng nó khác ở chỗ nó hoạt động ngay cả khi "các cột không khớp nhau theo thứ tự." Bạn đang nói điều đó không đúng?
LarsH

51

Cách dễ nhất và đúng trên một dòng duy nhất:

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

Khóa chính và các loại cột sẽ được giữ.


1
Điều này là hiển nhiên ... nhưng nếu đã có một bảng có tên đó trong cơ sở dữ liệu đích, thì không thể. Vì vậy, không thể thêm vào dữ liệu đã có với giải pháp đó (tuyệt vời khác)
Martin Meeser

@MartinMeeser Câu hỏi là về việc sao chép bảng không hợp nhất các bảng. Bạn có thể thử hợp nhất bằng cách kết xuất thành tệp tạm thời, chỉnh sửa tệp xóa câu lệnh CREATE TABLE và sử dụng tệp tạm thời làm đầu vào cho new.db. Nhưng xung đột trên khóa chính có thể xảy ra
Bernardo Ramos

@MartinMeeser, thực sự hợp nhất các công trình, nếu bảng tồn tại trong DB đích, bạn sẽ nhận được thông báo lỗi, nhưng dữ liệu sẽ được sao chép.
Vincnetas

3
@MartinMeeser trong phiên bản SQLite tôi đã cài đặt (v3.19.3), .dumptạo lệnh CREATE TABLE IF NOT EXISTS ...và không có lỗi ngay cả khi bảng đích của tôi tồn tại.
Kỹ sư đảo ngược

1
Cách đơn giản, thân thiện với UNIX để giải quyết vấn đề. Bạn xứng đáng với upvote của tôi. Cảm ơn bạn!
Augusto Destrero

9

Đối với hành động một lần, bạn có thể sử dụng .dump và .read.

Kết xuất bảng my_table từ old_db.sqlite

c:\sqlite>sqlite3.exe old_db.sqlite
sqlite> .output mytable_dump.sql
sqlite> .dump my_table
sqlite> .quit

Đọc kết xuất vào new_db.sqlite giả sử bảng không tồn tại

c:\sqlite>sqlite3.exe new_db.sqlite
sqlite> .read mytable_dump.sql

Bây giờ bạn đã nhân bản bảng của bạn. Để làm điều này cho toàn bộ cơ sở dữ liệu, chỉ cần bỏ tên bảng trong lệnh .dump.

Tiền thưởng: Các cơ sở dữ liệu có thể có các bảng mã khác nhau.


7

Mã Objective-C để sao chép Bảng từ Cơ sở dữ liệu sang Cơ sở dữ liệu khá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

Tôi cần chuyển dữ liệu từ cơ sở dữ liệu nhỏ gọn của máy chủ sql sang sqlite, vì vậy, sử dụng máy chủ sql 2008, bạn có thể nhấp chuột phải vào bảng và chọn 'Script Table To' và sau đó 'Data to Chèn'. Sao chép các câu lệnh chèn loại bỏ các câu lệnh 'GO' và nó được thực thi thành công khi được áp dụng cho cơ sở dữ liệu sqlite bằng ứng dụng 'Trình duyệt DB cho Sqlite'.


0

Kịch bản đầu tiên: DB1.sqlite và DB2.sqlite có cùng bảng (t1), nhưng DB1 "cập nhật" hơn so với DB2. Nếu nó nhỏ, hãy bỏ bảng từ DB2 và tạo lại nó với dữ liệu:

> DROP TABLE IF EXISTS db2.t1; CREATE TABLE db2.t1 AS SELECT * FROM db1.t1;

Kịch bản thứ hai: Nếu đó là một bảng lớn, bạn có thể tốt hơn với một INSERT if not existsgiải pháp loại. Nếu bạn có một Unique Keycột, nó sẽ thẳng hơn, nếu không, bạn cần sử dụng kết hợp các trường (có thể là mọi trường) và đến một lúc nào đó, nó vẫn nhanh hơn để chỉ dropvà lại createbảng; nó luôn luôn thẳng hơn (cần ít suy nghĩ hơn).


THIẾT LẬP: mở SQLite không có DB tạo cơ sở dữ liệu temporarytrong bộ nhớ main, sau đó attachDB1.sqlite và DB2.sqlite

> sqlite3
sqlite> ATTACH "DB1.sqlite" AS db1
sqlite> ATTACH "DB2.sqlite" AS db2

và sử dụng .databasesđể xem các cơ sở dữ liệu đính kèm và các tập tin của họ.

sqlite> .databases
main: 
db1: /db/DB1.sqlite
db2: /db/DB2.sqlite

LƯU Ý: Điều này không bảo tồn UNIQUEPRIMARY KEYthuộc tính, vì vậy nếu bạn có những thứ đó, bạn sẽ cần DROP TABLEvà thủ công CREATEINSERThoặc sử dụng .dump.read phương pháp được đề cập ở trên bởi @Thinkeye.
Có thể Mac
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.