【问题标题】:Detailed error message for violation of Primary Key constraint in sql2008?sql 2008 中违反主键约束的详细错误消息?
【发布时间】:2009-02-04 22:39:22
【问题描述】:

我将大量行插入到一个空表中,其中一列上有一个主键约束。 如果出现重复键错误,有没有办法找出导致错误的键(或行)的值?

遗憾的是,我现在无法在插入之前验证数据。

使用 SQL 2008。

谢谢!


按事物进行计数(*)/分组是我试图避免的事情,这是从数百个不同的数据库(其中一些在远程服务器上)插入数亿行......我没有时间或空间进行两次插入。

提供者的数据应该是唯一的,但不幸的是,他们的验证似乎无法在 100% 的时间内正常工作,我正在尝试至少看看哪里出了问题,以便帮助他们进行故障排除。

谢谢!

【问题讨论】:

    标签: sql-server sql-server-2008


    【解决方案1】:

    没有一种方法不会减慢您的流程,但这里有一种方法可以让您更轻松。您可以在该表上添加一个代替触发器以进行插入和更新。触发器将在插入之前检查每条记录,并确保它不会导致主键冲突。您甚至可以创建第二个表来捕获违规行为,并在该表上使用不同的主键(如标识字段),触发器会将行插入到您的错误捕获表中。

    以下是触发器如何工作的示例:

    CREATE TRIGGER mytrigger ON sometable
    INSTEAD OF INSERT
    AS BEGIN
      INSERT INTO sometable SELECT * FROM inserted WHERE ISNUMERIC(somefield) = 1 FROM inserted;
      INSERT INTO sometableRejects SELECT * FROM inserted WHERE ISNUMERIC(somefield) = 0 FROM inserted;
    END
    

    在该示例中,我在将数据插入表之前检查一个字段以确保它是数字的。您将需要修改该代码以检查是否存在主键违规 - 例如,您可能会将 INSERTED 表连接到您自己的现有表中,并且只插入未找到匹配项的行。

    【讨论】:

      【解决方案2】:

      解决方案取决于这种情况发生的频率。如果是

      1. 插入数据
      2. 如果出错,则执行 Bravax 修改后的解决方案(删除约束、插入、查找 dup、报告并终止 dup、启用约束)。

      这意味着它只会在错误发生的几次上让您付出代价。

      如果这种情况发生得更频繁,那么我会考虑让男孩们去看看提供者:-)

      【讨论】:

        【解决方案3】:

        修订:
        既然你不想插入两次,你可以:

        Drop the primary key constraint.
        Insert all data into the table
        Find any duplicates, and remove them
        Then re-add the primary key constraint
        

        上一个回复: 将数据插入到没有主键约束的表的副本中。

        然后对其运行查询以确定 rpimary 键列具有重复值的行。

        select count(*), <Primary Key>
        from table
        group by <Primary Key>
        having count(*) > 1
        

        【讨论】:

        • 奇怪的做法。现在你有一个充满重复的表,这意味着稍后会删除。
        • 但是您已经确定了问题所在的重复项。
        • 并不能真正确定哪一行出错了,只是存在主键冲突的行。
        • 它识别哪个主键...从而识别哪一行。
        • 如果其他进程正在访问表,则可能会产生问题。坏主意。
        【解决方案4】:

        使用 SSIS 导入数据并让它作为数据流的一部分进行检查。这是最好的处理方式。 SSIS 可以将不良记录发送到表中(您可以稍后将其发送给供应商以帮助他们清理他们的行为)并处理好的记录。

        【讨论】:

          【解决方案5】:

          我不敢相信 SSIS 不能轻易解决这个“现实”,因为,让我们面对现实吧,您经常需要并且希望能够:

          1. 查看是否存在具有某个唯一键或主键的记录
          2. 如果没有,请插入
          3. 如果有,请忽略它或更新它。

          我不明白如果没有以易于使用的方式内置的这种功能,他们会如何让产品推出市场。比如,设置一个组件的属性来自动检查。

          【讨论】:

            猜你喜欢
            • 2014-08-12
            • 2021-04-11
            • 2016-08-24
            • 2021-12-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多