SQL Server违反PRIMARY KEY约束'PK

时间:2011-11-11 07:00:01

标签: sql sql-server sql-server-2005

当我检查应用程序的日志时,我收到此错误:

  

[数据库]例外:dbi.integrity-error,[Microsoft] [ODBC SQL   服务器驱动程序] [SQL Server]违反PRIMARY KEY约束   'PK__tblRaw201131411__13D55980'。无法在对象中插入重复键   'dbo.tblRaw201131411'。在EXEC中

     

[数据库]例外:dbi.integrity-error,[Microsoft] [ODBC SQL   服务器驱动程序] [SQL Server]违反PRIMARY KEY约束   'PK__tblRaw201131412__407DE2C5'。无法在对象中插入重复键   'dbo.tblRaw201131412'。在EXEC中

     

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

如何解决此错误?

我的应用程序正在使用SQL Server 2005数据库。

5 个答案:

答案 0 :(得分:6)

您可以通过不尝试插入具有重复主键的行来修复此错误。

你如何这取决于你的应用程序,你没有提供的细节(mssqlinterface.py的第900到960行将是一个特殊的良好开端第951行上的标记。

也许您在尝试更新时尝试插入。也许设置主键值的代码在某种程度上是不足的。

可能性在字面上(我的意思是在非常具象的意义上),无穷无尽。

答案 1 :(得分:0)

不要将相同的值插入主键列两次......?

答案 2 :(得分:0)

由于这是主要密钥违规,因此您尝试插入的内容会使主键使用的数据不唯一。

1)你可以不这样做,确保你不添加重复的PK数据

2)也许您需要将主键更新为复合键(Key使用2个或更多列),以便PK使用的数据可以是唯一的。

3)如果您手动输入您正在使用的数据作为PK,可以在此表中添加另一个名为ID的列(如果适用)并将其设置为自动递增,然后将其设为PK,因此您的PK将始终为独特。

4)删除PK(这通常是一个非常糟糕的主意)

如果没有更多的数据,很难提供解决方案,但一眼就能看出这四个选项是我的建议。

答案 3 :(得分:0)

有同样的错误。标识列不保证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!

答案 4 :(得分:0)

看起来您正在尝试导入具有重复记录的文件。通常我会将它们导入临时表并在导入到生产表之前清理数据以清除它们。您还可以通过SSIS pacakage数据流删除重复记录。最重要的是找出文件具有重复记录的原因以及您尝试导入的数据模型的含义。例如,假设您要导入一个销售代表的名单,每个销售代表都有一个领土。假设你的表认为terrtory是唯一的,从而使它成为PK。然后你得到一个新的客户端,你得到一个PK错误,因为他们有两个共享领土的代表。只是删除记录对你没有任何好处(那些代表将无法访问你的系统),你现在需要修复你的应用程序来处理共享terrtories的代表。在另一种情况下,可能是他们忘记删除不再存在的人的记录,您可以要求提供固定文件并继续使用当前流程。