공통 데이터가 있지만 다른 목적을 가진 2 개의 SQLite 데이터베이스가 있고 데이터를 다시 삽입하지 않으려 고했기 때문에 한 데이터베이스에서 다른 데이터베이스로 전체 테이블을 복사 할 수 있는지 궁금합니다.
공통 데이터가 있지만 다른 목적을 가진 2 개의 SQLite 데이터베이스가 있고 데이터를 다시 삽입하지 않으려 고했기 때문에 한 데이터베이스에서 다른 데이터베이스로 전체 테이블을 복사 할 수 있는지 궁금합니다.
답변:
ATTACH 명령을 사용하여 Database Y에 Database X를 첨부 한 다음 전송할 테이블에 대해 적절한 Insert Into 명령을 실행해야합니다.
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
하여 출력을 볼 수 있는 데이터베이스 목록을 확인 하십시오.시퀀스 이름 파일 --- --------------- -------------------------------- -------------------------- 메인 0 개 /mnt/fastaccessDS/core/csv/atlanta.db 오전 2시 /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를 사용할 수 있습니다.
old_db.sqlite에서 my_table 테이블을 덤프하십시오.
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);
}
}
첫 번째 시나리오 : 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
테이블을; 항상 더 직설적입니다 (생각이 덜 필요합니다).
설정 : temporary
메모리 main
데이터베이스 를 생성 한 DB1없이 SQLite를 연 다음 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으로합니다.