【问题标题】:Violation of Primary Key Constraint when inserting into empty table插入空表时违反主键约束
【发布时间】:2015-01-05 16:53:07
【问题描述】:

我正在尝试使用 SSIS 将选择信息从一个数据库复制到另一个数据库。我直接从 SSMS 中的旧表编写了新表,因此它们应该是相同的。它们被设置为 [Col1]、[Col2]、[Col3]、[Col4]、[Col5],具有 [Col1] 和 [Col2] 的聚类 PK。

我开始在 SSIS 中使用带有 select 语句的 OLEDB 源设置数据流任务

SELECT [Col1], [Col2], [Col3], [Col4], [Col5] FROM [DBO].[dbo].[table] WHERE [Col5] LIKE 'AB%'

然后是 SQL Server 目标。我不断收到主键约束错误,因此我将其更改为 OLEDB 源和文件目标以进行错误处理。 615911 行被写入数据库,另外 49970 行被写入文件。

我在被拒绝的行之间找不到任何共同点。它们都是唯一的,因为它们必须是唯一的,因为源表上的 PK 约束与目标表上的相同。我已经抽查过了,目标表中不存在任何内容,尽管当我尝试从错误输出文件复制到目标表时仍然出现 PK 错误。据我所知,目标表中不存在具有相同 [Col1] 或 [Col2] 的条目,尽管其他行确实有重复的 [Col1] 或 [Col2]。

有什么建议吗?

【问题讨论】:

  • 您是否绝对肯定目标表上的 PK 在两列上,而不仅仅是其中一列?
  • 再次检查两个表的架构是否相同。
  • 修改你的目标表。删除主键。运行包。您的所有数据都应该加载。然后运行查询以查找重复项SELECT D.Col1, D.Col2 FROM dbo.Table AS D GROUP BY D.Col1, D.Col2 HAVING COUNT(1) > 1; 该查询是否产生任何结果?如果是这样,那么你有你的副本。如果没有,那么您的主键不是您指定的。
  • 我检查了双重检查和三重检查模式是否相同。我知道目标表上的 PK 在两列上,因为我检查了,还因为 SSIS 给出了导致问题的第一个 PK 值并将两个列值都作为 PK 值。
  • 致 billinkc:这样做我确实得到了大约 100 个重复的行。但是怎么做?它们不会在源中重复,只是在目标中。为什么它在设置 PK 时拒绝了 49k 行,但在我删除 PK 时只给了我 100 个重复项?每行的计数为 2。此外,具有重复项的表的行数与我试图带来的各个记录相匹配。这是怎么发生的?

标签: sql-server database ssis


【解决方案1】:

源表区分大小写。目标表不是。在将 Col1 的排序规则更改为 CS 而不是 CI 时删除它并再次创建它。

我仍然不知道为什么在删除 PK 后返回的重复项和被踢到错误文件的行之间存在差异,但这并不重要,只要它正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2022-01-06
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    相关资源
    最近更新 更多