【问题标题】:An INSERT INTO in MSSQL Server 2005 that groups by a column leads to unexpected duplicate key violationSQL Server 2005 中按列分组的 INSERT INTO 导致意外的重复键冲突
【发布时间】:2015-05-27 16:50:19
【问题描述】:

我正在 Microsoft SQL Server 2005 上执行存储过程。有问题的代码已经完美运行了大约 12 个月,但现在因“重复密钥违规错误”而失败

如何获得重复的密钥违规错误?

这是错误:

违反主键约束“Pk_temp_item_sales_details” 无法在对象“dbo.temp_item_sales_details”中插入重复键。 [SQLSTATE 23000][Error2627]

这是执行的 SQL:

TRUNCATE TABLE temp_item_sales_details;

INSERT INTO temp_item_sales_details
            (item_id,
             last_order_date)
SELECT detail.item_no,
       Max(header.sales_invoice_date)
FROM   invoice_header header WITH(NOLOCK)
       JOIN invoice_detail detail WITH(NOLOCK)
         ON header.invoice_number = detail.invoice_no
WHERE  Isnumeric(detail.item_no) = 1
GROUP  BY detail.item_no 

invoice_detail 表中的item_novarchar,而temp_item_sales_details 表中的item_idnumeric,但我只选择带有ISNUMERIC(detail.item_no) = 1 的数值

【问题讨论】:

标签: sql-server stored-procedures sql-server-2005 unique-constraint


【解决方案1】:

您的 invoice_detail item_no 值具有前导零。在 varchar 语法中,0123123 是不同且唯一的,但是如果将它们转换为数字,则会发生冲突。如果可以避免,我强烈建议避免以这种方式转换主键值。如果没有,您将需要有一种方法来处理此问题。

【讨论】:

  • 带有不同前导零的项目编号是罪魁祸首。所以解决方案是按演员分组(detail.item_no as bigint)
猜你喜欢
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多