>

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 단계로이 작업을 수행해야한다고 생각합니다.

    이전 테이블을 가져 와서 이전 ID를 유지하고 새 ID를 생성해야합니다. 그런 다음 새 데이터베이스에 있고 새 ID와 기존 ID가 모두 있으면 이전 ID를 사용하여 새 ID를 연결할 수 있으며 이전 ID를 삭제합니다.

    이 작업은 임시 (즉, 폐기 될) 테이블로 가져온 다음 영구 테이블에 삽입하여 이전 ID를 제거함으로써 수행 할 수 있습니다.

    또는 새로운 테이블로 직접 가져 오거나 (이전 ID를 보유하도록 스키마를 수정 한 후) 더 이상 필요하지 않으면 이전 ID를 삭제하십시오.

    수정 :

    좋아요. 여기 의견과 다른 답변 덕분에 당신이 찾고있는 것에 대해 조금 더 명확합니다. 이걸 때렸어요, 당신이 원하는 걸 할 것 같아요.

    기본적으로 커서가 없으면 부모 테이블을 통해 행 단위로 단계별로 이동하여 새 ID를 동기화 된 상태로 유지하면서 새 부모 행과 해당 부모 행의 모든 ​​자식 행을 삽입합니다. 나는 그것을 시도하고 작동해야하며, 테이블에 독점적으로 액세스 할 필요가 없으며 커서보다 더 빨리 웅장해야합니다.

    declare @oldId as int
    declare @newId as int
    select @oldId = Min(ParentId) from OldTable1 
    while not @oldId is null
    begin
        Insert Into NewTable1 (Name)
        Select Name from OldTable1 where ParentId = @oldId
        Select @newId = SCOPE_IDENTITY()
        Insert Into NewTable2 (ParentId, Foo)
        Select @newId, Foo From OldTable2 Where ParentId = @oldId
        select @oldId = Min(ParentId) from OldTable1 where ParentId > @oldId
    end
    
    

    이것이 도움이되기를 바랍니다.

  • 답변 # 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"(또는 데이터베이스에 적합한 명령)을 사용하여 임시 테이블을 영구 위치로 수정했습니다.

  • 이전 vba - 공유 사서함에 대한 회신 이벤트에서 'FROM'필드 변경
  • 다음 내 쿼리가 잘못된 데이터로 반환되었습니다