2010-01-12 6 views
2

테이블의 기본 키를 변경해야합니다. 문제는 일부 키가 기존 키 값으로 변경된다는 것입니다. 예 : ID3 => 4이고 레코드 ID. 4 => 5. 나는 그들이 외래 키 (어떤 업데이 트를 계단식으로)로 설정되어있는 기본 키로 유지해야 합리적인 방법이 이것을 달성하거나, 나는 SQL heresey을 시도하고 있습니까?SQL - SQLDataAdapter 기본 키 위반을 야기하는 업데이트

그 이유는 필자는이 기본 키로 연결된 테이블 집합에서 데이터를 가져 와서 비슷하게 구조화 된 테이블 집합에 삽입/업데이트합니다. 중복 제거 프로세스의 일부이기 때문에 삽입이 부분적으로 이루어 지므로 새 기본 키가 삽입 될 모든 테이블을 간단히 업데이트 할 수 있다면 삶이 더 쉬울 것입니다.

하나의 해결 방법은 들어오는 테이블보다 더 높은 대상 테이블에서 인덱스를 시작하는 것입니다. (들어오는 테이블은 매번 인덱스가 다시 지정됩니다.)하지만 여전히 가능한지 알고 싶습니다. 그렇지 않으면 위의 작업을 수행하십시오.

TIA

+0

따라서 기존 레코드의 기본 키가 변경되고 다른 외래 키가 다른 테이블에 있으면 좋지만 ** 새로운 ** 레코드는 반드시 다른 데이터베이스와 동일한 키를 가져야합니다. 그게 다야? 왜냐하면 삽입 된 레코드에 새로운 키를주고 다른 테이블에 ** 관련된 레코드를 모두 넣을 수 있다면 좋을 것입니다. 그러면 정말 쉽습니다. –

답변

1

당신은 SQL 이단을 시도하고 있습니다. 나는 실제로 꽤 개방적이며, 많은 사람들이 미친 듯이 보이는 것을해야한다는 것을 알고 있습니다. 그것은 상황이 무엇인지를 알 때 사람들이 "다르게해야한다"라고 오만하게 대답 할 때 나를 귀찮게합니다. 그러나 나는 당신이 이것을 다르게해야한다고 말해야합니다.. ㅎ.

아니요, sql \ DataAdapter를 사용하여 우아하게 수행 할 수는 없습니다. 은 일련의 t-sql 명령을 사용하여 ADO.NET을 통해 수행 할 수 있습니다. ID 덮어 쓰기 모드 (set identity_insert theTable on)를 설정할 때마다 해당 테이블의 모든 값이 하나씩 증가 된 쿼리를 수행 한 다음 자동 넘버 덮어 쓰기 모드로 전환해야합니다. 그러나 이것을 외래 키로 사용하는 다른 모든 테이블을 증가시켜야합니다. 그러나 잠깐, 그것을 가져 악화 :

  • 이 시간 동안이 테이블에 일어나고 다른 아무것도 할 수 없기 때문에 당신이하는 거래 모든이에게 필요하고, 오류가 있었기 때문에 경우에 당신이 가장 확실히 것 롤백해야합니다. 이것은 상당한 크기의 처리 일 수 있습니다. 너의 테이블은 좋은 잠김으로 잠겨있을거야.
  • 이러한 테이블간에 외래 키 제약 조건이있는 경우이 작업을 수행하기 전에 해제해야하며 이후에 다시 구현해야합니다.
+0

주어진 예는 명확성을위한 것입니다. 고유 한 열을 기반으로 최종 테이블의 다른 ID에 매핑됩니다. 관련 테이블을 올바른 외래 키로 각각의 최종 테이블로 이동하는 매핑이 필요합니다. 최종 테이블에 삽입/업데이트하기 전에 각 테이블의 각 행에서 외래 키를 업데이트 할 수 있습니다. 여기에서 약간 속일 수있는 것처럼 보입니다. – Brian

+0

아, 알겠습니다.따라서 기존 테이블의 키가 45,987이고 세는 경우 20,000 개의 레코드를 추가 할 수 있습니까? 추가는 50,001에서 70,000으로 매핑됩니까? ID 입력란에 간격이 있으면 괜찮습니다. (그렇지 않으면 매핑 테이블을 마지막 순간에 업데이트하고 정상적인 프로세스에서 새로운 삽입 작업을 중단해야합니다.) 나에게 가장 직접적인 방법 인 것 같습니다. . 내가 뭘 놓치고 있니? –

+0

새로운 엔터티의 경우 작동하지만 일부 엔티티는 기존 레코드에 해당하며 일부 데이터는 업데이트하거나 삽입 할 수있는 관련 테이블입니다. 소스 테이블과 대상 테이블 세트가 모두 id 패턴과 고유하게 식별되는 여러 컬럼으로 구성된 중앙 테이블과 함께 스타 패턴에 있음을 언급하는 것이 도움이 될 것입니다. – Brian

0

업데이트 기본 키 값에 대해 생각하기 시작하면 경보 벨이 울리기 시작해야합니다. 더 쉬워 보일지 모르겠지만 해결책보다는 해킹으로 더 많이 분류 할 것입니다. 개인적으로, 나는 실제 문제를 해결하려고 다시 생각할 것입니다. 지금은 더 어려워 보일지 모르지만 잠재적 인 끔찍한 문제를 유지하고 줄이는 것이 훨씬 낫습니다.

+0

기본 키가 변경 될 테이블이 작업 테이블입니다. 많은 처리가 끝나면 행이 실제 테이블에 삽입 (또는 갱신)됩니다. 실제 테이블의 행에는 반드시 서로 다른 기본 키가 있습니다. 중앙 스크래치 테이블의 기본 키를 업데이트하면 데이터가 최종 테이블에 삽입 될 때까지 중앙 테이블의 기본 키에 의해 연결된 모든 스크래치 테이블을 손쉽게 유지할 수 있습니다. 더 이상 그렇게 보이지 않습니다. – Brian

관련 문제