2011-09-26 5 views
0

동일한 테이블 레이아웃을 가진 두 개의 데이터베이스가 있습니다. 관심있는 표가 12 개 정도 있습니다. 그것들은 그들 사이의 수많은 FK입니다.oracle - 데이터를 동일한 데이터베이스로 이동

상위의 부모 테이블의 PK를 기반으로 데이터베이스 A에서 데이터베이스 B로 데이터를 복사하는 저장 프로 시저를 작성하라는 메시지가 표시되었습니다. 하나의 가치 또는 가치 목록 만받을 수 있습니다. 값과 일치하는 데이터베이스 A의 모든 레코드를 선택하고 데이터베이스 B에 삽입/업데이트해야합니다. 이는 하위 테이블의 모든 레코드도 포함합니다.

내 질문에 가장 좋은 (가장 효과적/모범 사례) 방법은 무엇입니까?

12 개 중에서 선택하십시오 ... insert into ... statements?

함께 테이블에 가입해야하나요? 동시에 모든 테이블에 삽입하려고합니까?

감사합니다.

추가 정보 : 레코드가 없으면 삽입해야합니다. (해당 테이블의 PK를 기준으로 함). 그렇지 않으면 업데이트해야합니다.

분명히 모든 하위 테이블로 이동해야하므로 상위 테이블에 복사 할 레코드가 하나만 있지만 하위 테이블에는 10이 있고 하위 테이블에는 500 개가있을 수 있습니다. 레코드가 이미 존재하는 경우 업데이트해야합니다. 하위 테이블에 대한 레코드가 없으면 삽입하십시오.

업데이트 : 최상위 레벨 키와 관련된 모든 레코드를 삭제하면 솔루션이 더 간단해질 것이라고 생각합니다. , 업데이트를 시도하는 대신 모든 새 레코드를 삽입하십시오. 공상은 하나의 SQL 문에서 모든 삽입을 할 조인의 좀 몇 가지를 할

delete from ... where ... in ... 

select from ... where ... in ... 
insert into... 

하거나 더 나은 :

그래서 질문은 다스을하는 것이 최선의 추측?

+0

일회성 운동이나 정기적 인 운동입니까? 어떤 버전의 데이터베이스입니까? 당신의 실패 단위는 무엇입니까? - 모든 기록 또는 단지 주어진 최고 수준의 PK? – APC

+0

이것은 일반적인 프로세스입니다. 최상위 수준 PK에 오류가있는 경우 해당 PK를 다시 실행할 수 있습니다.레코드를 업데이트하는 대신 레코드를 모두 삭제 한 다음 삽입 만 할 수 있습니다. 솔루션을 간단하게 만들겠습니까? – kralco626

답변

2

모든 외래 키 제약 조건을 해제 한 다음 업데이트 및 삽입을 처리하기 위해 MERGE 문 집합을 수행 한 다음 모든 제약 조건을 활성화하면됩니다.

로깅에 대해 생각해보십시오. 얼마나 많은 다시 실행을 생성 하시겠습니까?

모든 대상 테이블을 잘라내어 nolog가있는 모든 데이터를 삽입하는 것이 더 빠르고 더 좋습니다. 병합보다 간단 할 수 있습니다.

주요 주요 대안 중 하나는 모든 목표 테이블을 삭제하고 내보내기 및 가져 오기를 사용하는 것입니다. 훨씬 빠를 수도 있습니다.

특히 대상 테이블에 대한 갱신을 수행 할 필요가없는 경우 구체화 된 뷰를 사용하는 것이 두 번째 대안입니다. 그렇게하면 오라클이 모든 어려움을 극복합니다. 새로 고침 그룹을 신중하게 선택하여 무결성을 강제 할 수 있습니다.

이 비즈니스 문제를 처리하는 데는 여러 가지 방법이 있습니다. PL/SQL 프로그램이 좋지 않을 수 있습니다.

관련 문제