2012-01-12 2 views
1

동일한 디자인의 두 데이터베이스와 MySQL의 다른 레코드 고유 한 기본 키가있는 두 개의 주 테이블이 있습니다. (다른 데이터베이스의 두 레코드가 같은 기본 키를 갖고 있으면 같은 의미입니다.)동일한 디자인의 두 데이터베이스 병합 (MySQL)

이 두 테이블은 다른 테이블과의 관계가 많습니다. 하지만 문제는 작은 테이블 PK가 모든 DB에서 고유하지 않습니다 (자동 증가)

이제이 두 데이터베이스의 데이터를 병합하고 싶습니다.

아이디어가 있으십니까?

+0

우리가 지금까지 무엇을 얻었는지 정확히 알 수 있고 당신이하고 싶은 것을 더 잘 이해할 수 있도록 코드/데이터베이스 구조를 포함하십시오 – Tom

+0

자동 증분을 기본 키로 사용하는 경우 비즈니스 평등의 가정 잘못된 것입니다. –

+0

은 동일하게 유지하기 위해 기본 키를 필요로 하는가? –

답변

2

편집 : 나는 키가 독특한에서 데이터베이스 것을 당신의 문을 오해 생각합니다. 이 경우 이미 대상 데이터베이스에있는 경우 원본 데이터베이스의 행을 삽입하지 않습니다. 그런 다음 동일한 외래 키를 사용하여 외래 키 테이블에 여전히 복사 할 수 있습니다. 단지의 경우 아래의 오래된 대답을 떠나

INSERT INTO MainTable (PK, field1, field2) 
SELECT (PK, field1, field2) 
FROM OldMainTable 
WHERE PK NOT IN (SELECT PK FROM MainTable) 

:

그래서 기본적으로

.

가장 좋은 방법은 OldPrimaryKey 필드를 가지고 테이블을 수정하는 것입니다. 그런 다음 대상 데이터베이스에 데이터를 삽입 할 때 원본 PK를 OldPrimaryKey 필드에 저장하십시오. 당신이 외래 키와 아무것도 삽입 할 때 다음, OldPrimaryKey 필드까지 FK에 맞는 모양과 일치하는 외부 키를 업데이트합니다.

는 SO 쿼리가 같은 것을 볼 수있다 (! 아마 좋은 생각은 경우뿐만 아니라 외부 키의 복사본을 생성하기 위해) :

INSERT INTO MainTableTarget (OldPrimaryKey, field1, field2...) 
SELECT PrimaryKey as OldPrimaryKey, field1, field2... 
FROM OldMainTable 

INSERT INTO Table2Target (OldTable2PK, MainTableForeignKey, fielda, fieldb...) 
SELECT Table2PK as OldTable2PK, 
     (SELECT PK FROM MainTableTarget) as MainTableForeignKey, --This get the FK to point at the newly created database record 
     fielda, 
     fieldb 
FROM OldTable2 

그것은 아마있을거야 고통을하지만 여기서 고통스럽지 않은 옵션이 있다고 생각하지 마십시오 ...

오, 미안 구문이 약간 벗어난다면 ... 저는 T-SQL 사용자이므로 MySQL 구문을 잘 모릅니다. 바라건대 당신은 생각을 얻는다.

1

가장 간단한 방법은 아마 각 테이블에 대해 다음과 같은 쿼리를 사용하는 것입니다 :

INSERT IGNORE INTO db2.sometable 
SELECT * FROM db1.sometable 

것은 그냥 당신이 외래 키 문제로 실행되지 않도록 올바른 순서로 테이블을 처리해야합니다 (예 : 먼저 두 가지 테이블을 수행 한 후 관련 테이블)

+0

외래 키 문제가 발생하지 않는 방법은 없습니다. 오류를 무시한다고해서 마술처럼 사라지는 것은 아닙니다 ... – CodeRedick

+0

그는 올바른 순서로 말했습니다 ... 테이블 종속성에 대한 토폴로지 정렬을 수행하면 할 수 있습니다. –

+0

@Telos - 그는 이미 동일한 PK를 가진 두 레코드가 동일하므로 INSERT IGNORE를 사용하는 것이 적절하다고 말했습니다. –

2

이 답변은 "서로 다른 데이터베이스의 두 레코드가 동일한 기본 키를 가지고 있다면 동일하다"는 가정에 크게 의존한다. 데이터가 다음

INSERT INTO db2.sometable 

SELECT * FROM db1.sometable on duplicate key ignore 

하지 않은 그냥 복제 오류를 무시하는 무시 삽입 0으로 외래 키 검사를 설정, 깨끗한 지 가정. 각 테이블에 대해 그렇게 당신은 당신이 위상 정렬을 테이블을 실행하고 활성화 외래 키 검사를 유지하면서 최초의 루트 테이블을 삽입 할 수 있습니다 추가 안전 할 경우 1. 외래 키 검사를 설정합니다. 당신이 합성 기본 키가있는 경우, 모든 베팅은 꺼져 있고 당신은 훨씬 어렵 키를 재 할당해야합니다.

+0

나는이 답변이 내 것보다 낫다고 생각합니다. 오류 처리에 대한 언급이 있습니다 . –

관련 문제