OLD 데이터베이스의 두 테이블에서 새로운 데이터베이스로 일부 데이터를 마이그레이션하려고합니다.
문제는 가져올 첫 번째 테이블에 대해 새 데이터베이스에서 새 기본 키를 생성하고 싶다는 것입니다. 간단합니다.
그러나 이전 데이터베이스의 두 번째 테이블은 첫 번째 테이블에 외래 키 종속성이 있습니다. 따라서 두 번째 테이블에서 이전 데이터를 마이그레이션하려는 경우 외래 키가 더 이상 일치하지 않습니다.데이터를 마이그레이션하는 데 도움이되는 요령이 있습니까?
심각한 참고 : 'old id'열이없는 새 테이블의 현재 스키마를 변경할 수 없습니다.
다음 테이블 스키마를 사용하자 :-
Old Table1 New Table1
ParentId INT PK ParentId INT PK
Name VARCHAR(50) Name VARCHAR(50)
Old Table 2 New Table 2
ChildId INT PK ChildId INT PK
ParentId INT FK ParentId INT FK
Foo VARCHAR(50) Foo VARCHAR(50)
따라서 테이블 스키마는 동일합니다.
생각?
수정 :문의하는 사람들을 위해 RDBMS는 Sql Server 2008입니다. 소프트웨어를 지정하지 않았기 때문에 일반적인 T-Sql을 사용하여 불가지론적인 답변을 얻을 수 있기를 기대했습니다. P
- 답변 # 1
- 답변 # 2
음, oldPK =>newPK와 같은지도를 만들기 위해 다른 기준을 결정해야한다고 생각합니다 (예 :
Name
). 필드가 동일합니까?그러면 기존 PK와 일치하는 새 PK를 결정하고
ParentID
를 조정할 수 있습니다 그에 따라.약간의 트릭을 수행 할 수도 있습니다. 복사 된 레코드의 새 PK 값을 저장하는 새 열을 원본 Table1에 추가하십시오. 그런 다음 이전 PK 대신 새 열의 값을 가리키는 Table2의 값을 쉽게 복사 할 수 있습니다.
수정: 내 작은 속임수의 의미에 대한 샘플 코드를 제공하려고합니다. 원래 데이터베이스 구조를 변경하지 않고 임시 테이블을 사용하고 있습니다.
알겠습니다. 다음을 시도해보십시오 :
1) 기존 테이블의 값을 보유하고 새로운 PK를 얻는 임시 테이블을 생성합니다 :
CREATE TABLE #tempTable1 ( newPKField INT, oldPKField INT, Name VARCHAR(50) )
2) 기존 테이블의 모든 값을 기존 PK를 복사하여 새 PK를 계산하는 임시 테이블에 삽입합니다 :
INSERT INTO #tempTable1 SELECT newPKValueHere AS newPKField, ParentID as oldPKField, Name FROM Table1
3) 값을 새 테이블에 복사
INSERT INTO NewTable1 SELECT newPKField as ParentId, Name FROM #tempTable1
4) Table2의 값을 NewTable2로 복사
INSERT INTO NewTable2 SELECT ChildID, t.newPKField AS ParentId, Foo FROM Table2 INNER JOIN #tempTable1 t ON t.ParentId = parentId
그렇습니다. 이것은 의사 T-SQL 코드 일뿐입니다. 실제 데이터베이스에서는 테스트하지 않았습니다! 그러나 필요한 것에 근접해야합니다.
- 답변 # 3
이전 테이블의 스키마를 변경할 수 있습니까? 그렇다면 이전 테이블에 "새 ID"열을 넣고이를 참조로 사용할 수 있습니다.
새 테이블에서 행 단위 삽입을 수행 한 다음 scope_identity를 검색하여 이전 테이블 1에 저장해야합니다. 그러나 table2의 경우 이전 table1에 조인하고 new_id를 가져올 수 있습니다.
- 답변 # 4
먼저-나중에 삭제할 수있는 임시 스키마를 가질 수 없습니까?! 그렇게하면 인생이 더 쉬워 질 것입니다. 할 수 없다고 가정 :
운이 좋으면 (그리고 동시에 다른 인서트가 발생하지 않는다고 보장 할 수 있다면) Table1의 데이터를 새 테이블에 삽입 할 때 인서트의 순서에 의존하여 부정 행위를 할 수 있습니다 . 그런 다음 두 테이블을 행 수로 조인하는 뷰를 만들어 키를 서로 연관시킬 수 있습니다. 이렇게하면 새 Table2의 'ParentId'를 식별 할 수있게됩니다. - 답변 # 5
사용중인 데이터베이스 소프트웨어가 확실하지 않은지 확실하지 않지만 일시적인 경우 테이블은 옵션입니다. table1의 원래 기본 키와 table1의 새 기본 키를 포함하는 임시 테이블을 작성하십시오. 그런 다음 table2 사본으로 다른 임시 테이블을 작성하고 이전에 작성한 "이전 키, 새 키"테이블을 사용하여 사본을 업데이트 한 다음 "insert into select from"(또는 데이터베이스에 적합한 명령)을 사용하여 임시 테이블을 영구 위치로 수정했습니다.
관련 자료
- STATICFILES_DIRS error when trying to migrate tables - 테이블 마이그레이션을 시도 할 때 staticfiles_dirs 오류 - 장고 헤 로쿠
- sql server - ms sql - 다른 테이블의 내용을 기반으로 x 개의 행 업데이트
- How to insert into table with values from another tables - 다른 테이블의 값으로 테이블에 삽입하는 방법 - mysql 내부 조인
- javascript - 사용자의 가치를 다른 HTML 파일로 보내려고 시도
- sql - 다른 테이블의 값을 통해 테이블 필터링
- join - sql - 테이블을 결합하고 각 셀을 다른 테이블의 일치 셀로 나눕니 까?
- seo - Google 봇이 같은 컴퓨터에있는 다른 웹 사이트의 URL을 크롤링하려고합니다
- sql server - SQL에서 여러 테이블의 값을 표시하려고
- python 3.x - 체크섬을 계산하려고하지만 무한 루프에 갇히게됩니다설명 해주십시오?
- microsoft excel - 다른 시트에서 테이블의 "Total Row"값을 참조하는 방법은 무엇입니까?
- Ruby on Rails가 다른 엔티티로 로그인 한 상태에서 사용자 테이블의 부울을 업데이트하려고합니다
- class - Java 클래스를 배우고 내 코드가 적절한 값 세트를 반환하지 않는 이유를 파악하려고 노력했습니다
- macbook pro - macOS Catalina Patcher에서 부팅을 시도 할 때 Mac이 로딩 막대에서 멈춤
- ruby - 메뉴에서 선택했을 때 다른 스크립트에서 메소드 실행 시도
- sql server - 일부 테이블에 존재하고 다른 테이블에 존재하지 않는 데이터를 찾는 SQL
- php - laravel에서 내 테이블을 마이그레이션하려고 할 때 다음 오류가 계속 발생합니다
- Rails를 사용하여 한 테이블의 한 레코드가 nil에서 nil이 아닌 다른 테이블로 저장하는 방법은 무엇입니까?
- SQL Server 데이터베이스 엔진 원격 연결
- sql : 바나나는 좋아하지만 사과는 좋아하지 않는 고객 -쿼리 개선
- SQL 서버: 16진수에서 base64로
- SQL은 ISO_year4wkperiod의 마지막 날짜를 얻습니다.
- sql : 테이블 b에 정확히 일치하는 두 개의 요소가 있는 테이블 a의 요소 수 계산
- SQL에서 정확한 시간의 두 날짜의 차이
- MSSQL에서 값이 0인 경우에도 모든 월(1월부터 12월까지)이 표시되도록 하려면 어떻게 해야 합니까?
- TSQL HHMMSS의 VARCHAR를 TIME으로 변환
- SQL Server 테이블의 XML 데이터 구문 분석
- SQL Server: 중단된 내보내기 재개
2 단계로이 작업을 수행해야한다고 생각합니다.
이전 테이블을 가져 와서 이전 ID를 유지하고 새 ID를 생성해야합니다. 그런 다음 새 데이터베이스에 있고 새 ID와 기존 ID가 모두 있으면 이전 ID를 사용하여 새 ID를 연결할 수 있으며 이전 ID를 삭제합니다.
이 작업은 임시 (즉, 폐기 될) 테이블로 가져온 다음 영구 테이블에 삽입하여 이전 ID를 제거함으로써 수행 할 수 있습니다.
또는 새로운 테이블로 직접 가져 오거나 (이전 ID를 보유하도록 스키마를 수정 한 후) 더 이상 필요하지 않으면 이전 ID를 삭제하십시오.
수정 :
좋아요. 여기 의견과 다른 답변 덕분에 당신이 찾고있는 것에 대해 조금 더 명확합니다. 이걸 때렸어요, 당신이 원하는 걸 할 것 같아요.
기본적으로 커서가 없으면 부모 테이블을 통해 행 단위로 단계별로 이동하여 새 ID를 동기화 된 상태로 유지하면서 새 부모 행과 해당 부모 행의 모든 자식 행을 삽입합니다. 나는 그것을 시도하고 작동해야하며, 테이블에 독점적으로 액세스 할 필요가 없으며 커서보다 더 빨리 웅장해야합니다.
이것이 도움이되기를 바랍니다.