2012-01-30 2 views
1

대상 테이블에 삽입하기 전에 데이터를 받아 들여 스크럽하고 정리하는 스테이징 테이블 집합이 있습니다. 대상 테이블에는 기본 키 제약 조건이 있으며 삽입 대상은 기본 키입니다.잘라 내기/삭제로 인한 SQL Server 기본 키 위반?

삽입하기 전에 대상 테이블에 기본 키가 없는지 확인합니다. 나는 기본 키의 부재에 따라, 대상 테이블에없는 경우에만 레코드를 삽입 :

:

INSERT INTO Target 
    SELECT 
     primKey 
     , user_state 
     , test_state 
    FROM 
     myStagingTable3 

이 점에 의해, stagingTable3는 다음 where 절을 사용하여 목표 테이블에 존재하지 않는 경우에만 데이터가

WHERE 
     primKey not in (Select primKey from Target) 

어떻게 든, 나는 기본 키 위반 오류를 받고 있어요 :

메시지 2627, 수준 14, 상태 1 (절차는 ... 라인 번호에 실패) 기본 키 형 구조 위반 raint 'pk1101AE'. 내가 삽입 할 키가 대상 테이블에 존재하지 않을 때 조건이 기본 키 위반이 발생할 수 있는지에 따라

  • : 대상 '대상'

내 질문에 중복 키를 삽입 할 수 없습니다 ?

  • 레코드의 이전 삭제로 인해 기본 키가 유지 될 수 있습니까? 그렇다면 어떻게 든이 문제를 해결할 수 있습니까?
  • 다른 정보
  • 내 스테이징 테이블에 키가 있고 타겟 테이블에없는 것이 분명합니다. 그러나 삽입이 실패합니다.

    +0

    내가 그 I를 추가해야 이 게시물을 읽으십시오 : http://stackoverflow.com/questions/5278588/violation-of-primary-key-constraint-sql-error 그리고 delete/truncate 문제는 흥미 롭습니다. 그 문제를 해결하는 방법을 모른다. 이것에 멍청한 놈. 감사. – user991945

    +0

    스테이징 테이블에는'primKey'의 값이 여러 개있을 가능성이 큽니다. – dasblinkenlight

    +0

    흠, 그냥 확인해 봤는데 ... 사실입니다 ... primKey의 값이 여러 개 있습니다. 그리고 그것은 SECOND 키 값이 오류를 일으키는 원인이된다는 것을 의미합니다. 따라서 모든 것이 배제되고 트랜잭션이 롤백됩니다. 나는 중복 된 것들을 제거 할 수 없다면 여기서 병합 성명서를 볼 것입니다. 그렇게하면 삽입 후에도 업데이트 할 수 있습니다. 항상 간단한 것을 확인하십시오. – user991945

    답변

    2

    스테이징 테이블에 primKey 값이 동일한 여러 행이 포함되어 있기 때문에 이런 현상이 발생합니다. 이 복제 된 것들 중 {user_state, test_state} 쌍 삽입로를 만드는 당신에게 문제가되지 않는 경우

    , 당신은 완전히 같은 간단한 group by을 추가하여 문제를 우회 할 수있다 :

    INSERT INTO Target 
        (SELECT 
         primKey 
        , MAX(user_state) 
        , MAX(test_state) 
        FROM 
         myStagingTable3 
        GROUP BY primKey) 
    
    관련 문제