2011-05-23 198 views
2

這裏是代碼違反PRIMARY KEY約束錯誤SQL

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 

但我得到這個錯誤

消息2627,級別14,狀態1,行PRIMARY KEY的3
衝突約束'pkAR_Transactions'。 不能在對象'dbo.AR_Transactions'中插入重複鍵。
該聲明已被終止。

我不是在SQL親......任何想法,我做錯了

+1

哪個字段是主鍵? – Marco 2011-05-23 21:06:42

+0

Trans_ID是我認爲的主鍵...正如我所說我不知道​​SQL ...我是一個MySQL和PHP開發人員,我是foriegn到SQL服務器2008年 – Trace 2011-05-23 21:09:23

+1

由於消息明確說:你試圖插入一個**重複值**到任何您在該表上的主鍵。解決方案:不要這樣做!表**的主鍵必須始終是唯一的 - 在任何情況下,**無法在表中的兩個行中爲主鍵使用兩個相同的值。 – 2011-05-23 21:09:57

回答

1

在設計上,你的表[cresql].[dbo].[AR_Transactions]應該保持主鍵只有一個值 - 在你的情況下,這似乎是組成這個PK的列的組合。

這不是SQL問題,但似乎是一個設計概念。

你應該找出鍵的組合是使你的主鍵 - 這可能是因爲您可以插入一次,該組合更新以後(雖然我不認爲這是很好的設計)設計狀態。

編輯

由於TRANS_ID是PK,而你不使用你插入該列,則說明要麼被插入身份,作爲默認(brrrrr),或使用觸發器。看到檢查是否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?列表

備選方案:

有可能是插入到可能有問題的審覈表的觸發器。檢查表是否有其他觸發器,並查看它們的作用。

+0

我如何找出它們是什麼 – Trace 2011-05-23 21:10:30

+1

@Tamer:你決定哪個字段是/首要的關鍵...所以你應該(必須)知道,當你設計你的數據庫... – Marco 2011-05-23 21:13:49

+2

@Marco:別人可能已經設計了表。 – 2011-05-23 21:14:51

相關問題