한 SQLite 데이터베이스에서 다른 SQLite 데이터베이스로 데이터 복사


141

공통 데이터가 있지만 다른 목적을 가진 2 개의 SQLite 데이터베이스가 있고 데이터를 다시 삽입하지 않으려 고했기 때문에 한 데이터베이스에서 다른 데이터베이스로 전체 테이블을 복사 할 수 있는지 궁금합니다.

답변:


171

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;

1
또한 SQLite Expert Personal 프로그램을 사용하는 경우 마우스 오른쪽 버튼을 클릭하고 데이터베이스를
첨부 할 수

6
먼저 테이블을 만들어야합니다!
Cris Luengo

55

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;

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


2
'INSERT INTO atlanta SELECT * FROM AM.atlanta;'사용 엉망인 것들. 모든 데이터를 복사했지만 일부 필드가 바뀌 었습니다! 사용하지 마십시오. 대신 허용 된 답변의 명령을 사용하거나 더 명시 적으로 : "INSERT INTO X.TABLE (Id, Value) SELECT Id, Value FROM Y.TABLE;이 기능이 제대로 작동했습니다.
Karim Sonbol

@KarimSonbol 유일한 차이점은 수락 된 답변 전송에서 연결된 데이터베이스로 당신이 당신의 batabase에서 수행되는 반면이 답변에서는 다른 방법입니다.
Tulains Córdova

@ TulainsCórdova : 허용되는 답변 (마지막 변형)은 "열이 순서대로 일치하지 않는 경우"에도 작동한다는 점에서 다릅니다. 사실이 아니라고 말하는가?
LarsH

52

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

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

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


1
이것은 분명합니다 ...하지만 대상 데이터베이스에 해당 이름의 테이블이 이미 있으면 불가능합니다. 따라서 해당 솔루션으로 기존 데이터에 추가 할 수 없습니다 (그렇지 않은 경우)
Martin Meeser

@MartinMeeser 문제는 테이블을 병합하지 않는 테이블을 복사하는 것입니다. CREATE TABLE 문을 제거하고 임시 파일을 new.db의 입력으로 사용하여 파일을 편집하여 임시 파일로 덤프하여 병합을 시도 할 수 있습니다. 그러나 기본 키에 충돌이 발생할 수 있습니다
베르나르도 라모스

@MartinMeeser, 실제로 병합하는 경우 테이블이 대상 DB에 존재하면 오류 메시지가 표시되지만 데이터가 복사됩니다.
Vincnetas

3
내가 설치 한 SQLite 버전의 @MartinMeeser (v3.19.3), .dump 는 명령을 생성하며 CREATE TABLE IF NOT EXISTS ...대상 테이블이 있어도 오류가 없습니다.
리버스 엔지니어

1
문제를 해결하기위한 단순하고 UNIX 친화적 인 방법입니다. 당신은 나의 공감대를받을 자격이 있습니다. 감사합니다!
Augusto Destrero

10

한 번의 작업으로 .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 명령에서 테이블 이름을 그대로 두십시오.

보너스 : 데이터베이스는 다른 인코딩을 가질 수 있습니다.


7

데이터베이스에서 다른 데이터베이스로 테이블을 복사하기위한 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);
        }
 }

0

SQL Server Compact 데이터베이스에서 sqlite로 데이터를 이동해야했기 때문에 SQL Server 2008을 사용하여 테이블을 마우스 오른쪽 단추로 클릭하고 '스크립트 테이블 대상'과 '데이터를 삽입 할 데이터'를 차례로 선택할 수 있습니다. insert 문을 복사하면 'GO'문이 제거되고 'DB Browser for Sqlite'앱을 사용하여 sqlite 데이터베이스에 적용되면 성공적으로 실행됩니다.


0

첫 번째 시나리오 : 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

참고 :이 보존하지 않습니다 UNIQUEPRIMARY KEY속성, 당신이 그있는 경우에 그래서, 당신도해야 DROP TABLE수동으로 CREATE하고 INSERT또는 사용 .dump.read 위에서 언급 한 방법 @Thinkeye으로합니다.
에이블 맥
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.