违反PRIMARY KEY约束错误SQL

时间:2011-05-23 21:03:47

标签: sql sql-server-2008

这是代码

BEGIN TRANSACTION

INSERT INTO [cresql].[dbo].[AR_Transactions] 
       (DateTime , Dirty, Store_ID, Trans_Type,  Cashier_ID, CustNum, Trans_Amount, Prev_Cust_Balance) 
    SELECT   
       DATEADD(MINUTE, -30, Getdate()), 1, 1001, 'C', 100199,     
       CustNum, -Acct_Balance, Acct_Balance 
    FROM  
       [cresql].[dbo].[Customer] 
    WHERE 
       Acct_Balance <> 0  

UPDATE [cresql].[dbo].[Customer] 
SET Acct_Balance = -500 
WHERE Acct_Balance <> 0  

COMMIT TRANSACTION

但我收到此错误

  

Ms 2627,Level 14,State 1,Line 3
  违反PRIMARY KEY约束'pkAR_Transactions'。不能   在对象'dbo.AR_Transactions'中插入重复键。
  声明已经终止。

我不是SQL的专家...任何想法我做错了

1 个答案:

答案 0 :(得分:1)

按照设计,您的表[cresql].[dbo].[AR_Transactions]应该只包含一个主键值 - 在您的情况下,这似乎是构成此PK的列的组合。

这不是SQL问题,但似乎是一个设计概念。

您应该找出构成主键的键的组合 - 可能是设计声明您可以插入一次并稍后更新该组合(尽管我不认为这是一个好的设计)。

修改

由于Trans_Id是PK,并且您没有在插入中使用该列,因此它将作为IDENTITY,DEFAULT(brrrrr)或使用TRIGGER插入。

IDENTITY:检查IDENTITY规范是否搞砸了。如果是这样,只需重置它。以下是How can I reseed an identity column in a T-SQL table variable?

的方法

DEFAULT:去查找设计表格的人并问他们

TRIGGER:查找触发器并阅读代码以查看其执行的操作。以下是查找触发器列表What is the most portable way to check whether a trigger exists in SQL Server?

的方法

替代方案:

可能有一个触发器插入可能有问题的AUDIT表中。检查表格是否有任何其他触发器并查看它们的作用。