2017-02-24 22 views
-1

私は次のエラーどのようにプライマリキーの違反を解決するSQLで重複した値のエラーを挿入することはできません?

メッセージ2627、レベル14、状態1、行を受けていOrderDetai11

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; 

からすべてのレコードをコピーすることを意図している私のOrder Detailsテーブルに次のクエリを実行します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

これはうまくいけません..第2のクエリにNOT exists部分を教えてください。 – Bodhi

+0

[最初にPRIMARY KEYが何であるかを知る必要があります。](https://msdn.microsoft.com/en-us/library/ms179610.aspx) これを理解していれば、あなたはあなたのエラー: "PRIMARY KEY制約の違反"。 2番目のクエリの条件は、キー(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

関連する問題