2014-02-05 2 views
0

내가 인해 일부 쓰레기 테스트 데이터는 여전히 표에있는 (그러나 라이브, 아무것도 발생할 수있는 시나리오가 가능하다)에 다른 테이블INSERT INTO 문에서 기본 키 위반 - 전체 문이 종료됩니까?

INSERT INTO table1 SELECT * FROM table2 

에서 테이블을 업데이트 할 수있는 문이, 나는 오류가

PRIMARY KEY 제약 조건 'PK_xxx'을 위반했습니다. 개체의 '표'표 2에서 SELECT 100 개 행을 반환하는 경우
문이 종료되었습니다

을 중복 키를 삽입 할 수없는 경우에만 위반을 표하기 위해 최선을 다하고 여부 최선을 다하고/압연 전체 INSERT INTO 진술하지 삽입 체한다 PK 위반으로 인해

답변

1

전체 문장이 커밋되지 않았습니다. 다음과 같이 쉽게 테스트 할 수 있습니다.

Create Table #Target (Id Int Primary Key) 
Insert Into #Target Values(1) 
Insert Into #Target Values(3) 
Insert Into #Target Values(5) 
Insert Into #Target Values(7) 

Create Table #Source (Id Int) 
Insert Into #Source Values(1) 
Insert Into #Source Values(2) 
Insert Into #Source Values(3) 
Insert Into #Source Values(4) 
Insert Into #Source Values(5) 
Insert Into #Source Values(6) 
Insert Into #Source Values(7) 
Insert Into #Source Values(8) 

Insert Into #Target(Id) 
Select Id From #Source 

Select * From #target 

Drop Table #Target 
Drop Table #Source 

위의 코드는 기본 키가있는 대상 테이블을 만듭니다. 그런 다음 동일한 컬럼이지만 다른 값을 갖는 소스 테이블을 작성합니다. 그런 다음 소스 테이블에서 목표 테이블로 행을 삽입 할 때 게시 한 명령과 유사한 명령이 실행됩니다.

그러면 대상 테이블에서 선택합니다. 보시다시피 원래 값만 있습니다.

이 코드를 대신 사용하면 누락 된 행만 삽입됩니다.

Insert 
Into #Target 
Select #Source.* 
From #Source 
     Left Join #Target 
      On #Source.Id = #Target.Id 
Where #Target.Id Is NULL