[database] 한 SQLite 데이터베이스에서 다른 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로 복사하는 것입니다.

단계

  1. sqlite3 atlanta.db (애틀랜타 데이터베이스로 이동)
  2. allmsa.db를 첨부하십시오. 이는 ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM;
    첨부 할 데이터베이스의 전체 경로를 제공한다는 명령 참고를 사용하여 수행 할 수 있습니다 .
  3. 다음을 사용 sqlite> .databases
    하여 출력을 볼 수 있는 데이터베이스 목록을 확인 하십시오.
시퀀스 이름 파일
--- --------------- -------------------------------- --------------------------
메인 0 개 /mnt/fastaccessDS/core/csv/atlanta.db
오전 2시 /mnt/fastaccessDS/core/csv/allmsa.db 
  1. 이제 당신은 실제 목표에 도달합니다. 명령을 사용하십시오
    INSERT INTO atlanta SELECT * FROM AM.atlanta;

이것은 당신의 목적에 부합해야합니다.


답변

한 줄에서 가장 쉽고 정확한 방법 :

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

기본 키와 열 유형이 유지됩니다.


답변

한 번의 작업으로 .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);
        }
 }


답변

SQL Server Compact 데이터베이스에서 sqlite로 데이터를 이동해야했기 때문에 SQL Server 2008을 사용하여 테이블을 마우스 오른쪽 단추로 클릭하고 ‘스크립트 테이블 대상’과 ‘데이터를 삽입 할 데이터’를 차례로 선택할 수 있습니다. insert 문을 복사하면 ‘GO’문이 제거되고 ‘DB Browser for Sqlite’앱을 사용하여 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테이블을; 항상 더 직설적입니다 (생각이 덜 필요합니다).


설정 : temporary메모리 main데이터베이스 를 생성 한 DB1없이 SQLite를 연 다음 attachDB1.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