【问题标题】:SQL Server : Duplicate Primary Key errorSQL Server:重复主键错误
【发布时间】:2017-12-20 02:07:34
【问题描述】:

我正在使用 SQL Server Express 并通过导入向导进行导入,因此没有提供真正的代码。

此处显示错误:

错误 0xc0202009:数据流任务 1:SSIS 错误代码 DTS_E_OLEDBERROR。
发生 OLE DB 错误。错误代码:0x80004005。
OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 11.0” Hresult:0x80004005 描述:“语句已终止。”。

OLE DB 记录可用。
来源:“Microsoft SQL Server Native Client 11.0”
结果:0x80004005
说明:“违反 PRIMARY KEY 约束 'PK_CXS'。无法在对象 'dbo.cxs' 中插入重复键。重复键值为 (00, 00, 000000, 2017, 03, 01, 00000000, 0)。”。

我已经在 Excel 中通过给定值进行过滤进行了测试。只有一排出现。我连接了代表主键的八列,然后查找重复项。没有找到。接下来,使用 Notepad ++ 中的 TextFX 工具,我尝试删除重复项,但没有找到。

还有其他方法可以找到这个看似不存在的重复项吗?

【问题讨论】:

  • 数据库中已经存在的记录呢?当您尝试导入表中已存在的主键时,您会收到错误消息。
  • 在每次导入错误之前,我使用 delete from dbo.XXX 删除所有记录。这足够还是我需要更进一步?
  • 嗨,蒂姆,看起来 PK_CXS 是一个复合主键,里面有多个东西,你要一起检查它们吗?还要检查密钥是否已自动生成。 p.s.在这里,一个巨大的复合主键对我来说看起来不太好,也许将主键切换到标识列会让生活更轻松?
  • 只是为了确保,尝试删除并重新创建表。如果它仍然产生错误,那么您就知道文件中存在重复项。
  • 如果它有任何值,我正在导入的平面文件中有 394,910。导入停止在 393,192

标签: sql sql-server duplicates primary-key


【解决方案1】:

一些建议(这并不是一个完整的答案,但根据给定的数据,我能做到)。

在某些情况下,您的文本文件中可能会有不同的文本数据(例如 1.000000001 和 1.000000002),但在转换成它们的文本后就变成了相同目标类型,因为截断、舍入或其他类型的转换效果。这可能是您无法在文本文件中找到重复项,而数据库却找到它们的原因。

您可以使用和检查的技术很少:

  1. 除了导入的数据......目标表上是否有任何以前的数据已经?如果是这样,那么您可能有重复的来源。

  2. 您是否有任何方法可以“逐行”(或分批)导入,以便帮助您找到违规的?

如果前面的替代方案都不可行,您可以按照以下流程进行:

  • 创建一个与您的目标结构相同的表,但没有任何PRIMARY KEYUNIQUE约束。我们就叫它load_table

  • 将您的数据导入此表。它不应该抱怨PRIMARY KEY 约束,因为没有任何约束。

  • 执行以下查询以找出重复项:

    SELECT 
        k1, k2, k3 ... kn 
    FROM 
        load_table
    GROUP BY
        k1, k2, k3 ... kn
    HAVING
        count(*) > 1
    

    其中k1k2k3 ...kn 是构成目标 表主键的所有列。

使用这些技术,您将找到 SQL Server 找到的重复项,但会避开您迄今为止使用的方法。

【讨论】:

  • 我将尝试将第 1 行导入到第 393,190 行,看看是否可行。进口停止在 394,910 中的 393,192
  • 我采纳了你的建议。原始数据源有 27 列,几乎不可能在所有 27 列中重复。因此,在 8 列(主键)处将其切断,然后创建没有主键的加载表。这是成功的。非常感谢。
  • 很高兴能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
相关资源
最近更新 更多