2017-02-24 51 views
-1

我執行下面的查詢到我的訂單明細表,其意在所有記錄OrderDetai11如何解決主鍵衝突不能在sql中插入重複值錯誤?

複製
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; 

我收到以下錯誤

消息2627,級別14,狀態1,行1違反主鍵 約束'PK_Order_Details'。無法在對象 'dbo.Order Details'中插入重複密鑰。重複的鍵值是(10248,11)。 聲明已被終止。

回答

3

假設[訂單明細]是[訂單明細11]的副本。你只需要插入或更新您的記錄:你可以使用一個MERGE(what is a MERGE? here),例如:

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 
); 

如果你只想複製沒有存在的記錄,你可以只排除[訂單詳細信息]裏面的值,例如:

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 
       ) 

編輯:

的其他例子:

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]中插入[OrderDetai11]內的OrderID

對於NOT IN查詢:我們檢查所有[OrderDetai11] .OrderIDs沒有人包含在[Order Details] .OrderID列表中。它實現與NOT EXISTS查詢相同的結果。

+0

釘牢它..在這裏罰款..你可以解釋我不存在第二個查詢部分 – Bodhi

+0

[首先你需要知道主鍵是什麼。](https://msdn.microsoft.com/en-us/library/ms179610.aspx) 如果你確實明白這一點,你現在知道你爲什麼會出錯:「違反主鍵約束」。我在第二個查詢中的條件是永遠不會觸發密鑰的重複(OrderID)。 – Lostblue

+0

Arg我剛剛意識到我假定OrderID是您的主鍵。那是對的嗎?否則,我的兩個答案都是完全錯誤的。 – Lostblue

1

您試圖將具有相同主鍵的記錄插入到新表中。

您需要確保原始表沒有重複記錄,推測您的主鍵是OrderID

您可以使用您的原始表此選擇查詢檢查:

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

如果有在total列2個以上的任何行,那麼你有重複。

您或者需要刪除重複項,或者如果您想保留它們,則需要在新表中創建一個新列並將其作爲主鍵。

後評論:

你原來的表可能沒有主鍵,或者,如果是這樣,你沒有正確複製它到新表。

沒有辦法,這是去工作,除非你做下列之一:

  • 創建一個新列,使主鍵。
  • 使用組合主鍵(由多個列組成的主鍵)。
  • 刪除OrderID作爲主鍵。
+0

大多數列都有重複,我需要插入所有這些,除了我有列名稱是相同的兩個表 – Bodhi