2017-02-24 1 views
-1

나는 메시지 2627 제가받은 OrderDetai11SQL에서 중복 값 오류를 삽입 할 수없는 기본 키 위반 문제를 해결하려면 어떻게해야합니까?

에서 다음과 같은 오류

insert 
into [dbo].[Order Details] (OrderID,ProductID,UnitPrice,Quantity,Discount) 
select OrderID,ProductID,UnitPrice,Quantity,Discount from[dbo].[Order Detai11] as OD1 
where OD1. OrderID between 1 and 150000; 

모든 기록을 복사하기위한 것입니다 내 주문 정보 테이블에 다음 쿼리, 수준 14, 상태 1, 줄을 실행 1 PRIMARY KEY 제약 조건 'PK_Order_Details'위반 개체에 중복 키를 삽입 할 수 없습니다. 'dbo.Order Details'. 중복 키 값은 (10248, 11)입니다. 문이 종료되었습니다.

답변

3

[주문 세부 정보]가 [주문 세부 사항 11]의 사본이라고 가정합니다.당신은 당신의 레코드를 삽입하거나 업데이트 할 :

MERGE [dbo].[Order Details] 
USING (select OrderID,ProductID,UnitPrice,Quantity,Discount 
     from[dbo].[Order Detai11] 
     where OrderID between 1 and 150000 
    ) As tblMergeDetail(OrderID,ProductID,UnitPrice,Quantity,Discount) 
ON ( tblMergeDetail.OrderId = [dbo].[Order Details].OrderId ) 
WHEN MATCHED THEN 
SET ProductID = tblMergeDetail.ProductID, 
    UnitPrice = tblMergeDetail.UnitPrice, 
    Quantity = tblMergeDetail.Quantity, 
    Discount = tblMergeDetail.Discount 
WHEN NOT MATCHED THEN 
INSERT (OrderID,ProductID,UnitPrice,Quantity,Discount) 
VALUES (
    tblMergeDetail.OrderID, 
    tblMergeDetail.ProductID, 
    tblMergeDetail.UnitPrice, 
    tblMergeDetail.Quantity, 
    tblMergeDetail.Discount 
); 

방금 ​​[주문 정보] 내부의 값을 제외 할 수 있습니다 만 아무도 존재하지 않는 기록을 복사 할 경우, 예를 들면 : 당신은 MERGE (what is a MERGE? here), 예를 사용할 수 있습니다 :

insert into [dbo].[Order Details] 
(OrderID,ProductID,UnitPrice,Quantity,Discount) 
select OrderID,ProductID,UnitPrice,Quantity,Discount 
from[dbo].[Order Detai11] as OD1 
where OD1.OrderID between 1 and 150000 
and NOT EXISTS ( select exclusionTbl.OrderID 
        from [dbo].[Order Details] exclusionTbl 
        where exclusionTbl.OrderID = OD1.OrderID 
       ) 

EDIT :

타 예 :

insert into [dbo].[Order Details] 
(OrderID,ProductID,UnitPrice,Quantity,Discount) 
select OrderID,ProductID,UnitPrice,Quantity,Discount 
from[dbo].[Order Detai11] as OD1 
where OD1.OrderID between 1 and 150000 
    and OD1.OrderID NOT IN( select exclusionTbl.OrderID 
          from [dbo].[Order Details] exclusionTbl 
          where exclusionTbl.OrderID between 1 and 150000 
         ) 

NOT EXISTS 쿼리의 경우 : [OrderDetai11]에서 삽입하려는 [Order Details] 내에 OrderID가 없음을 확인합니다.

NOT IN 쿼리의 경우 : [OrderDetai11] .OrderIDs를 모두 확인합니다 아무도 [Order Details] .OrderID의 목록에 포함되어 있지 않습니다. NOT EXISTS 쿼리와 동일한 결과를 얻습니다.

+0

... 벌금 ... 여기 두 번째 쿼리에 NOT exists 부분을 설명 할 수 있습니까 – Bodhi

+0

[처음에는 PRIMARY KEY가 무엇인지 알아야합니다.] (https://msdn.microsoft.com/en-us/library/ms179610.aspx) 그 사실을 이해했다면 이제는 오류가 발생하는 이유를 알게되었습니다. : "PRIMARY KEY 제약 조건 위반". 두 번째 쿼리의 내 조건은 키 (OrderID)의 중복을 트리거하지 않는 것입니다. – Lostblue

+0

Arg 그냥 OrderID가 기본 키라고 가정했다고 알고 있습니다. 그 맞습니까? 그렇지 않으면 나는 내 대답 모두에 완전히 틀리다. – Lostblue

1

동일한 기본 키가있는 레코드를 새 테이블에 삽입하려고합니다.

원본 테이블에 중복 레코드가 없는지 확인해야합니다. 기본 키는 OrderID 일 것입니다.

당신은 당신의 원래 테이블에서이 선택 쿼리를 사용하여이를 점검 할 수 total 열에서 2 개 이상있는 행이있는 경우

SELECT OrderID, COUNT(OrderID) AS Total 
FROM [dbo].[Order Detai11] 
GROUP BY OrderID 
ORDER BY Total DESC 

, 당신은 중복이있다.

중복을 제거해야하거나 보관하려는 경우 새 테이블에 새 열을 만들어 기본 키로 만들어야합니다.

후 댓글 :

원래 테이블은 아마 기본 키를 가지고 있지 않거나이하는 경우, 새 테이블에 제대로 복사되지했습니다.

이 다음 중 하나를 수행하지 않는 일 것입니다 방법이 없습니다 :

  • 가 새 열을 만들고 만드는 기본 키가.
  • 복합 기본 키 (두 개 이상의 열로 구성된 기본 키)를 사용하십시오.
  • OrderID을 기본 키로 제거하십시오.
+0

대부분의 열이 중복되어 있고 그 중 모두를 삽입해야하며 두 테이블 모두에 대해 열 이름이 동일해야합니다. – Bodhi

관련 문제