2011-02-06 5 views
3

정확히 비슷한 구조의 여러 위치에 여러 개의 데이터베이스 파일이 있습니다. 내가 첨부 기능을 하나의 데이터베이스 연결에 여러 파일을 연결하는 데 사용할 수있는 이해하지만,이 별도의 데이터베이스로 취급합니다. 내가 병합해야 데이터베이스 파일의 임의의 수를 가지고 있기 때문에 SQLite에서 여러 데이터베이스 파일을 병합하는 방법은 무엇입니까?

SELECT uid, name FROM DB1.Users UNION SELECT uid, name FROM DB2.Users ; 

가 유효한 대답이 아니다, 또한

SELECT uid, name FROM ALL_DATABASES.Users; 

: 내가 좋아하는 일을하고 싶습니다. 마지막으로 데이터베이스 파일은 분리되어 있어야합니다. 아무도 이것을 수행하는 방법을 알고 있습니까?

편집 : 대답은 저에게 아이디어를주었습니다 : 모든 다른 테이블의 조합 인보기를 만들 수 있습니까? 가능한 모든 데이터베이스 파일과 데이터베이스를 '마운트'한 다음 뷰 쿼리에서이를 사용하여 '마스터 테이블'을 만들 수 있습니까?

+0

왜 쿼리의 클라이언트에 논리적으로 테이블 개체 (DB 파일이 아님)를 결합하지 않으시겠습니까? 병합 할 데이터베이스 파일을 지정하려는 경우 (이번 주에 5 번이지만 다음 주에 7 또는 3 일 수 있음) 쿼리에서 동일한 작업을 수행 할 수없는 이유는 무엇입니까? – Tim

+0

그 이유는 다른 파일이 원격 서버에 있기 때문일 수도 있고 그렇지 않을 수도 있습니다. 나는 이미 로컬 파일 인 것처럼 보이는 추상적 개념을 가지고있다. 또한 로컬 데이터베이스와는 다른 데이터를 포함하지만 필수는 아닙니다. 본질적으로 모든 데이터베이스를 풀링하여 분산 데이터베이스를 만들었지 만 (이름이 제시 한 것과 완전히 다른 방식으로 사용되기 때문에이 용어를 사용하는 것을 주저하지만 필자는 파일이 이미 있으므로 분산 데이터베이스 솔루션을 원하지 않습니다. 지역과 그것은 단지 물건을 복잡하게한다). – chacham15

답변

5

SQLite는 한 번에 첨부 할 수있는 데이터베이스 수에 제한을두기 때문에 원하는 쿼리를 한 쿼리에서 수행 할 수있는 방법이 없습니다.

숫자가 SQLite의 한도 ("임의"의 정의에 위배 됨) 내에 있음을 보장 할 수있는 경우, 실행해야 할 시점에서 오른쪽 집합이 UNION 인 쿼리를 생성 할 수 없도록하는 것은 없습니다 . 스키마의 일부 영리함이 알아서 할

ATTACH DATABASE '/path/to/candidate/database' AS candidate; 
INSERT INTO some_table (uid, name) SELECT uid, name FROM candidate.User; 
DETACH DATABASE candidate; 
+1

첨부 된 테이블의 한계를 막을 수 있습니까? (임의적으로 의미하는 것은 1에서 최대 테이블 수의 시간에 따라 변하는 숫자입니다) 편집을 가능하게하는 방법이 있습니까? – chacham15

+0

예. 모든 데이터베이스를 첨부하고 다중 -UNION 쿼리를 생성하십시오. 쿼리가 미리 프로그램에 하드 코딩되어야한다는 법률은 없습니다. 뷰를 사용하여 이것을 수행한다면, 같은 방법으로 CREATE VIEW를 생성해야한다. – Blrfl

+0

코드가 첨부 된 dbfiles의 수를 쿼리 한 다음 이에 따라 쿼리를 조정해야한다고 말하고있는 것입니다. UNION cant가 항상 명백한 방법으로 수행 될 수 있기 때문에 이것은 사용자 프로그램에 대해 매우 성가 시게 할 수 있습니다. 예를 들어, 두 개의 데이터베이스가 분리되어 있기 때문에 기본 키가 별도로 증가하므로 동일한 기본 키가있는 두 개의 다른 레코드가있을 수 있습니다. 따라서 모든 복잡성이 뷰 뒤에 숨겨져 있고 다중 파일 추상화에 대해 걱정할 필요가 없기 때문에 코드를 훨씬 단순한 쿼리로 남겨 둘 수 있다고 생각했습니다. – chacham15

0

:

테이블의 진정으로 임의의 숫자를 지원하기 위해, 당신의 유일한 옵션은 INSERT 행 각 후보에서 반복적으로 관련이없는 데이터베이스에서 테이블을 생성하는 것입니다 .

일반적으로 참조 테이블과 동적 테이블이라는 두 가지 유형의 테이블이 있습니다. 참조 테이블은 국가 코드, 부서 코드 등 모든 데이터베이스에서 동일한 내용을 갖습니다.

동적 데이터는 시계열, 판매 통계 등과 같이 각 DB에 고유 한 데이터입니다.

참조 데이터는 마스터 DB에 유지 관리되어야하며 변경 후 동적 데이터베이스에 복제되어야합니다.

동적 테이블에는 모두 DB_ID에 대한 열이 있어야합니다.이 열은 복합 기본 키의 일부입니다. 예를 들어, 시계열에 db_id, measurement_id, time_stamp가 사용될 수 있습니다. 또한 DB_ID의 해시를 사용하여 기본 키를 생성하고 DB의 모든 테이블에 대해 동일한 pk 생성기를 사용할 수 있습니다. 다른 DBS에서 이들을 병합 할 때 데이터는 고유합니다.

그래서 당신은 데이터베이스의 3 가지해야합니다 : ->

  • 개별 동적 다른 모든 복제 -> 복제 된 전체 동적

  • 전체 동적 -

    • 참조 마스터> 참조 마스터 및 모든 개별 동적에서 복제됩니다.

    다음에, 필요에 따라 또는 전체 동적 매일이 복제, 의사 실시간 또는 무력을 절단하고 다시 작성하는 방법 당신에게 달려 있습니다.

  • 관련 문제