簡體   English   中英

SQL Server違反主鍵約束'PK

[英]SQL Server Violation of PRIMARY KEY constraint 'PK

我在檢查應用程序的日志時遇到此錯誤:

[數據庫]異常:dbi.integrity-error,[Microsoft] [ODBC SQL Server驅動程序] [SQL Server]違反了主鍵約束'PK__tblRaw201131411__13D55980'。 無法在對象'dbo.tblRaw201131411'中插入重復的密鑰。 在EXEC

[數據庫]異常:dbi.integrity-error,[Microsoft] [ODBC SQL Server驅動程序] [SQL Server]違反了PRIMARY KEY約束'PK__tblRaw201131412__407DE2C5'。 無法在對象'dbo.tblRaw201131412'中插入重復的密鑰。 在EXEC

在executeSQLStatement中的文件“ mssqlinterface.py”,第951行

如何解決這個錯誤?

我的應用程序正在使用SQL Server 2005數據庫。

您可以通過不嘗試使用重復的主鍵插入行來解決此錯誤。

如何做到這一點在很大程度上取決於您的應用程序,而您尚未提供該應用程序的詳細信息( mssqlinterface.py 900到960行是一個不錯的開始,而第951行是一個特殊標記)。

也許您正在嘗試插入何時進行更新。 設置主鍵值的代碼也許在某種程度上是不足的。

從字面上看,可能性是無限的(我的意思是從很形象的意義上說)。

發生了同樣的錯誤。 身份列不保證ID的唯一性。 這里是一些代碼來重現該錯誤,以及一個可能的解決方案:

CREATE TABLE atest (id INT NOT NULL IDENTITY(1,1) PRIMARY KEY , val VARCHAR(10));

insert atest values ('a')
insert atest values ('b')
insert atest values ('c')
insert atest values ('d')
insert atest values ('e')

delete atest  where id < 4

select * from atest
--4 d
--5 e

DBCC CHECKIDENT ('atest', RESEED, 0);

insert atest values ('aa')
insert atest values ('bb')
insert atest values ('cc')

select * from atest
--1 aa
--2 bb
--3 cc
--4 d
--5 e

-- Here comes the error!
insert atest values ('dd')
-- Oops!


-- Here's the Solution:
DBCC CHECKIDENT ('atest', RESEED);

-- Try again...
insert atest values ('dd')

select * from atest
--1 aa
--2 bb
--3 cc
--4 d
--5 e
--6 dd

--All good!

似乎您正在嘗試導入具有重復記錄的文件。 通常,我將它們導入到臨時表中,並在導入到生產表之前進行數據清理以清除它們。 您也可以通過SSIS pacakage數據流刪除重復的記錄。 最重要的是找出文件為何具有重復記錄,以及對於要導入的數據模型而言意味着什么。 例如,假設您要導入每個銷售代表的名冊。 假設您的表認為該區域是唯一的,因此使其成為PK。 然后,您獲得了一個新客戶,並且由於他們有兩個代表共享領土的銷售代表,因此出現PK錯誤。 僅僅刪除記錄對您沒有任何好處(那些代表將無法訪問您的系統),您現在需要修復您的應用程序以處理共享領域的代表。 在另一種情況下,可能是他們忘記了刪除不在那兒的人的記錄,而您可以索要固定文件並愉快地繼續當前的過程。

不要將相同的值兩次插入主鍵列...?

由於這是違反主鍵的行為,因此您嘗試插入一些東西,這會使主鍵使用的數據不唯一。

1)您根本無法做到這一點,請確保您不添加重復的PK數據

2)也許您需要將主鍵更新為復合鍵(鍵使用2列或更多列),以便PK使用的數據可以唯一。

3)如果您手動輸入用作PK的數據,則可以在此表中添加另一個名為ID的列(如果適用),並將其設置為自動遞增,然后將其設為您的PK,因此您的PK將始終是唯一的。

4)刪除PK(這通常是個壞主意)

如果沒有更多數據,確實很難提供解決方案,但是我一眼就建議這四個選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM