【问题标题】:Primary key violation while merging data from another table合并另一个表中的数据时违反主键
【发布时间】:2016-04-19 11:09:28
【问题描述】:

我有两个表,TBTC03 和 TBTC03Y,其中 TBTC03Y 有两个额外的列作为 EFFDTE 和 EXPDTE。我必须使用以下逻辑将数据从 TBTC03 合并到 TBTC03Y:

如果在 TC03Y 中没有找到匹配的 TC03 条目
使用 TC03 数据构建新的 TC03Y 记录
生效日期将默认为“01-01-1980”
到期日期将默认为 '09-30-1995'

我写了一个相同的查询:

insert into  TBTC03Y (LOB,MAJPERIL,LOSSCAUSE,NUMERICCL,EFFDTE,EXPDTE)
    select LOB,MAJPERIL,LOSSCAUSE,NUMERICCL,'0800101' ,'0950930'
     from TBTC03 where not EXISTS (select * from TBTC03Y where 
TBTC03Y.LOB =        TBTC03.LOB AND 
TBTC03Y.MAJPERIL   = TBTC03.MAJPERIL   AND
TBTC03Y.LOSSCAUSE  = TBTC03.LOSSCAUSE  AND
TBTC03Y.NUMERICCL  = TBTC03.NUMERICCL)

这两个表的主键是 LOB、MAJPERIL 和 LOSSCAUSE。

但是我有一些 TBTC03Y 记录,它们已经有带有主键的数据。

触发上述查询会在某些行上提供主键约束。 我无法弄清楚我该如何完成它。

【问题讨论】:

  • 样本数据和期望的结果确实有助于解释您想要做什么。
  • 感谢 Gordon,在编写示例数据时,我发现了问题所在。 :D

标签: sql sql-server tsql sql-insert sql-merge


【解决方案1】:

主键的问题在于您还在 WHERE 子句中包含了 NUMERICCL。如果您删除它,您将插入唯一数据。

您可能必须创建一个单独的进程,因为看起来每个表中都有一些记录具有相同的 LOB、MAJPERIL 和 LOSSCAUSE,但具有不同的 NUMERICCL。我可以在这里想到三个选项;

  1. 您的数据存在问题,需要修复。
  2. 也许您想更新此值以匹配,在这种情况下,您查看的是 UPDATE 而不是 INSERT INTO。
  3. 您需要更新复合主键以包含 NUMERICCL 列。
  4. 从 where 子句中删除 NUMERICCL 也会更正此问题。

【讨论】:

  • 哦,是的。我在尝试为问题编写示例数据时发现了它!谢谢!!
  • 很好,提出问题是为自己解决问题的好方法:)。我坐在一个根本不是技术人员的项目经理旁边,有时会问她一些我一直坚持的问题。大部分情况下她都帮不上忙,但重点是问这个问题经常会在我的脑海中触发一些事情。
【解决方案2】:

如果两个表的 PK 都是 {LOB, MAJPERIL, LOSSCAUSE},则应从 where 子句中删除 TBTC03Y.NUMERICCL = TBTC03.NUMERICCL

例子:

t1{LOB, MAJPERIL, LOSSCAUSE, NUMERICCL}
   1    1         1          1

t2{LOB, MAJPERIL, LOSSCAUSE, NUMERICCL}
   1    1         1          2

t2 中没有行 where:

TBTC03Y.LOB =        TBTC03.LOB AND 
TBTC03Y.MAJPERIL   = TBTC03.MAJPERIL   AND
TBTC03Y.LOSSCAUSE  = TBTC03.LOSSCAUSE  AND
TBTC03Y.NUMERICCL  = TBTC03.NUMERICCL

但是插入显然会违反t2 中的PK 约束:

t2{LOB, MAJPERIL, LOSSCAUSE}
   1    1         1 

【讨论】:

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