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?
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:
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;
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.
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.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
INSERT INTO atlanta SELECT * FROM AM.atlanta;
Điều này sẽ phục vụ mục đích của bạn.
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ữ.
.dump
tạ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.
Đố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.
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);
}
}
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'.
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 exists
giải pháp loại. Nếu bạn có một Unique Key
cộ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ỉ drop
và lại create
bả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 temporary
trong bộ nhớ main
, sau đó attach
DB1.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
UNIQUE
và PRIMARY KEY
thuộc tính, vì vậy nếu bạn có những thứ đó, bạn sẽ cần DROP TABLE
và thủ công CREATE
và INSERT
hoặc sử dụng .dump
và .read
phương pháp được đề cập ở trên bởi @Thinkeye.