如何解决违反主键无法在SQL Server中插入重复值错误?

时间:2017-02-24 14:22:12

标签: sql sql-server primary-key sql-insert

我对我的<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> <div id='app'></div>表执行了以下查询,该表旨在复制Order Details

中的所有记录
OrderDetai11

我收到以下错误

  

Msg 2627,Level 14,State 1,Line 1违反PRIMARY KEY   约束'PK_Order_Details'。无法在对象中插入重复键   'dbo.Order Details'。重复键值为(10248,11)。该   声明已被终止。

3 个答案:

答案 0 :(得分: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]

插入的[Order Details]中的OrderID

对于NOT IN查询:我们检查所有[OrderDetai11] .OrderIDs nobody包含在[Order Details] .OrderID列表中。它实现了与NOT EXISTS查询相同的结果。

答案 1 :(得分:1)

您尝试将具有相同主键的记录插入新表中。

您需要确保原始表没有重复记录,可能是您的主键是OrderID

您可以在原始表格上使用此选择查询来检查:

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

如果total列中有任何包含2个或更多行的行,则表示您有重复项。

您需要删除重复项,或者如果要保留它们,则需要在新表中创建一个新列,并将其作为主键。

评论后:

您的原始表可能没有主键,或者如果没有,您还没有将其正确复制到新表中。

除非您执行以下任一操作,否则无法使用此功能:

  • 创建一个新列并将其设为主键。
  • 使用复合主键(由多个列组成的主键)。
  • 删除OrderID作为主键。

答案 2 :(得分:0)

只需确保目标表没有重复项即可。并且如果源表中有重复项,请确保仅获取不同的记录。

<script>
  function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m, key, value) {
      vars[key] = value;
    });
    return vars;
  }
  var path = window.location.pathname;
  var pathName = path.substring(0, path.lastIndexOf('/') + 1);
  console.log(path);
  console.log(pathName);
  pathName = pathName.replace(/\//g, "")
  pathName = pathName.replace(/pricelist/g, "")

  pathName = pathName.replace(/\b\w/g, l => l.toUpperCase())

  var number = getUrlVars()["max_price"];
  var brand = getUrlVars()["brand"];
  brand = brand.replace(/\b\w/g, l => l.toUpperCase())

 if (window.location.href.indexOf("min_price") != null) {document.title = pathName + ' Under Rs. ' +  number;} 
if (window.location.href.indexOf("pa_brand") > -1) {document.title = brand + ' ' + pathName + ' Price List India';} 
if (window.location.href.indexOf("min_price") > -1 &&  window.location.href.indexOf("brand") > -1) {document.title = brand + ' ' + pathName + ' Under Rs.' + number;}

</script>