SQL Server违反了主键约束'PK'

3
当我检查我的应用程序的日志时,出现了以下错误:
[Databases] Exception : dbi.integrity-error, [Microsoft][ODBC SQL Server Driver][SQL Server]Violation of PRIMARY KEY constraint 'PK__tblRaw201131411__13D55980'. Cannot insert duplicate key in object 'dbo.tblRaw201131411'. in EXEC [Databases] Exception : dbi.integrity-error, [Microsoft][ODBC SQL Server Driver][SQL Server]Violation of PRIMARY KEY constraint 'PK__tblRaw201131412__407DE2C5'. Cannot insert duplicate key in object 'dbo.tblRaw201131412'. in EXEC File "mssqlinterface.py", line 951, in executeSQLStatement
如何修复此错误?
我的应用程序正在使用SQL Server 2005数据库。

你的表中的pk是什么?它是自动生成的还是手动输入的? - HLGEM
5个回答

6
你可以通过避免插入具有重复主键的行来解决此错误。
如何做取决于你的应用程序,你没有提供细节(mssqlinterface.py的900到960行是一个好的起点,在第951行上加上特殊标记)。
也许你正在尝试插入时应该更新。也许设置主键值的代码在某种程度上存在缺陷。
可能性实在是太多了(我指的是非常抽象的意义上)。

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!

0

看起来你正在尝试导入一个有重复记录的文件。通常我会将它们导入到一个暂存表中,并进行数据清理以摆脱它们,然后再导入到生产表中。你也可以通过SSIS包数据流来删除重复记录。最重要的是找出为什么文件有重复记录,以及这对你尝试导入的数据模型意味着什么。例如,假设你正在导入一个销售代表名单,每个代表都有一个领地。假设你的表认为领地是唯一的,因此将其作为主键。然后你得到了一个新客户,你会因为他们有两个共享领地的代表而得到一个主键错误。仅仅删除记录是没有用的(这些代表将无法访问你的系统),现在你需要修复你的应用程序来处理共享领地的代表。在另一种情况下,可能是他们忘记删除一个已经离开的人的记录,你可以要求一个修复后的文件,然后继续愉快地进行当前的流程。


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

0

由于这是主键冲突,您试图插入的内容会使主键使用的数据不唯一。

1)您可以简单地不这样做,确保不添加重复的PK数据

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

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

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

没有更多数据,很难提供解决方案,但乍一看,这些4个选项是我建议的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接