ฉันมีฐานข้อมูล SQLite 2 ตัวที่มีข้อมูลทั่วไป แต่มีจุดประสงค์ที่แตกต่างกันและฉันต้องการหลีกเลี่ยงการแทรกข้อมูลซ้ำดังนั้นฉันสงสัยว่ามันเป็นไปได้ไหมที่จะคัดลอกตารางทั้งหมดจากฐานข้อมูลหนึ่งไปยังอีกฐานข้อมูลหนึ่ง
ฉันมีฐานข้อมูล SQLite 2 ตัวที่มีข้อมูลทั่วไป แต่มีจุดประสงค์ที่แตกต่างกันและฉันต้องการหลีกเลี่ยงการแทรกข้อมูลซ้ำดังนั้นฉันสงสัยว่ามันเป็นไปได้ไหมที่จะคัดลอกตารางทั้งหมดจากฐานข้อมูลหนึ่งไปยังอีกฐานข้อมูลหนึ่ง
คำตอบ:
คุณจะต้องแนบฐานข้อมูล X กับฐานข้อมูล Y โดยใช้คำสั่งATTACHจากนั้นเรียกใช้คำสั่งแทรกเข้าไปที่เหมาะสมสำหรับตารางที่คุณต้องการถ่ายโอน
INSERT INTO X.TABLE SELECT * FROM Y.TABLE;
หรือหากคอลัมน์ไม่ตรงตามลำดับ:
INSERT INTO X.TABLE(fieldname1, fieldname2) SELECT fieldname1, fieldname2 FROM Y.TABLE;
ลองพิจารณาตัวอย่างที่ฉันมีสองฐานข้อมูลคือ allmsa.db และ atlanta.db สมมติว่าฐานข้อมูล allmsa.db มีตารางสำหรับ msas ทั้งหมดในสหรัฐอเมริกาและฐานข้อมูล atlanta.db ว่างเปล่า
เป้าหมายของเราคือคัดลอกตาราง atlanta จาก allmsa.db ไปยัง atlanta.db
ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM;
บันทึกคำสั่งที่เราให้เส้นทางทั้งหมดของฐานข้อมูลที่จะแนบsqlite> .databases
คุณสามารถเห็นผลลัพธ์เป็นไฟล์ชื่อ seq --- --------------- -------------------------------- -------------------------- 0 main /mnt/fastaccessDS/core/csv/atlanta.db 2 AM /mnt/fastaccessDS/core/csv/allmsa.db
INSERT INTO atlanta SELECT * FROM AM.atlanta;
สิ่งนี้ควรตอบสนองวัตถุประสงค์ของคุณ
วิธีที่ง่ายที่สุดและถูกต้องในบรรทัดเดียว:
sqlite3 old.db ".dump mytable" | sqlite3 new.db
คีย์หลักและประเภทคอลัมน์จะถูกเก็บไว้
.dump
สร้างคำสั่งCREATE TABLE IF NOT EXISTS ...
และไม่มีข้อผิดพลาดแม้ว่าตารางปลายทางของฉันจะมีอยู่ก็ตาม
สำหรับการกระทำครั้งเดียวคุณสามารถใช้. dump และ .read
ดัมพ์ตาราง my_table จาก old_db.sqlite
c:\sqlite>sqlite3.exe old_db.sqlite
sqlite> .output mytable_dump.sql
sqlite> .dump my_table
sqlite> .quit
อ่านดัมพ์ลงใน new_db.sqlite สมมติว่าไม่มีตารางอยู่
c:\sqlite>sqlite3.exe new_db.sqlite
sqlite> .read mytable_dump.sql
ตอนนี้คุณได้โคลนโต๊ะของคุณแล้ว ในการทำเช่นนี้สำหรับฐานข้อมูลทั้งหมดเพียงแค่ปล่อยชื่อตารางในคำสั่ง. dump
โบนัส: ฐานข้อมูลสามารถมีการเข้ารหัสที่แตกต่างกัน
รหัส Objective-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);
}
}
ฉันต้องการย้ายข้อมูลจากฐานข้อมูลขนาดกะทัดรัดของเซิร์ฟเวอร์ sql ไปยัง sqlite ดังนั้นการใช้ sql server 2008 คุณสามารถคลิกขวาบนตารางและเลือก 'Script Table To' แล้วเลือก 'Data to Inserts' คัดลอกคำสั่งแทรกลบคำสั่ง 'GO' และดำเนินการสำเร็จเมื่อนำไปใช้กับฐานข้อมูล sqlite โดยใช้แอป 'DB Browser for Sqlite'
สถานการณ์สมมติแรก: DB1.sqlite และ DB2.sqlite มีตารางเดียวกัน (t1) แต่ DB1 มี "ทันสมัย" มากกว่า DB2 หากมีขนาดเล็กให้วางตารางจาก DB2 และสร้างใหม่ด้วยข้อมูล:
> DROP TABLE IF EXISTS db2.t1; CREATE TABLE db2.t1 AS SELECT * FROM db1.t1;
สถานการณ์ที่สอง: ถ้าเป็นตารางขนาดใหญ่คุณอาจจะดีกว่าด้วยINSERT if not exists
โซลูชันประเภท หากคุณมีUnique Key
คอลัมน์มันจะตรงไปข้างหน้ามากขึ้นมิฉะนั้นคุณจะต้องใช้การรวมกันของเขตข้อมูล (อาจจะทุกสาขา) และในบางจุดก็ยังเร็วกว่าที่จะเพียงแค่drop
และcreate
ตารางอีกครั้ง; มันตรงไปตรงมามากขึ้น (จำเป็นต้องมีการคิดน้อย)
การตั้งค่า: เปิด SQLite โดยไม่ต้อง DB ซึ่งสร้างฐานข้อมูลtemporary
ในหน่วยความจำmain
จากนั้นattach
DB1.sqlite และ DB2.sqlite
> sqlite3
sqlite> ATTACH "DB1.sqlite" AS db1
sqlite> ATTACH "DB2.sqlite" AS db2
และใช้.databases
เพื่อดูฐานข้อมูลที่แนบมาและไฟล์ของพวกเขา
sqlite> .databases
main:
db1: /db/DB1.sqlite
db2: /db/DB2.sqlite
UNIQUE
และPRIMARY KEY
คุณสมบัติดังนั้นหากคุณมีสิ่งเหล่านั้นคุณจะต้องDROP TABLE
และด้วยตนเองCREATE
และINSERT
หรือใช้.dump
และ.read
วิธีการที่กล่าวถึงข้างต้นโดย @Thinkeye