【问题标题】:SQL Server Violation of PRIMARY KEY constraint 'PKSQL Server 违反 PRIMARY KEY 约束 'PK
【发布时间】:2011-11-11 07:00:01
【问题描述】:

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

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

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

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

如何解决这个错误?

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

【问题讨论】:

  • 你表中的pk是多少?它是自动生成的吗?

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


【解决方案1】:

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

如何你如何做到这一点很大程度上取决于你的应用程序,你没有提供的细节(mssqlinterface.py 的第 900 到 960 行将是一个好的开始,在第 951 行)。

也许您正在尝试在应该更新时插入。也许设置主键值的代码在某些方面存在缺陷。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      由于这是违反主键的行为,因此您尝试插入一些内容,这会使主键使用的数据不唯一。

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

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          您似乎正在尝试导入具有重复记录的文件。通常,我将它们导入临时表并在导入生产表之前进行数据清理以摆脱它们。您还可以通过 SSIS 包数据流删除重复记录。最重要的是找出文件有重复记录的原因以及这对于您尝试导入的数据模型意味着什么。例如,假设您正在导入一个销售代表名册,每个销售代表都有一个区域。假设您的表认为该区域是唯一的,因此将其设为 PK。然后你得到一个新客户,你得到一个 PK 错误,因为他们有两个代表共享一个领域。仅仅删除记录对您没有任何好处(那些代表将无法访问您的系统),您现在需要修复您的应用程序以处理共享区域的代表。在另一种情况下,可能是他们忘记删除不再存在的人的记录,您可以要求一个固定的文件并愉快地继续您当前的流程。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多