【问题标题】:INSERT INTO SELECT CROSS JOIN Composite Primary KeyINSERT INTO SELECT CROSS JOIN 复合主键
【发布时间】:2015-08-06 20:43:02
【问题描述】:

我正在 SQL Server 中执行 INSERT INTO SELECT 语句。情况是两个不同表的两个主键没有任何共同之处,它们都是第三个表的外键,在最后一个表中形成一个复合主键。这通常可以通过交叉连接来完成 - 例如,

Table1.ID(PK)
Table2.Code(PK)

-- Composite PK for Table3
Table3.ID(FK)
Table3.Code(FK)

INSERT INTO Table3
SELECT ID, Code
FROM Table1
CROSS JOIN Table2
WHERE Some_conditions...

我收到“无法插入重复的键行”错误。不允许 Table2.Code 在 Table3 中重复,因为它是唯一的 ID,即使 Table3 的主键是 Table1.ID 与 Table2.Code 组合。因此,以下对应被识别为表 3 中的不同 PK 值,例如:{1024, PSV} 和 {1027, PSV}。

有没有办法解决这个问题,还是我设计的这个数据库不正确? 我曾考虑为 Table3 创建第三个唯一 ID,但在这种情况下非常不切实际。

【问题讨论】:

  • 您的表中似乎已经有与新行冲突的数据。
  • 你能发布实际的表定义和前两个表的几行吗?到目前为止,还没有发布很多细节,很难说发生了什么。
  • 您是否可能对与主键分开的列之一具有唯一性约束?
  • 第三张表是否有 IDENTITY 列?
  • 不,它没有 - 请参阅原帖的最后一句话。

标签: sql sql-server composite-primary-key cross-join on-duplicate-key


【解决方案1】:

这将帮助您定位问题:

SELECT ID, Code
FROM Table1
CROSS JOIN Table2
WHERE Some_conditions...
GROUP BY ID, Code
HAVING COUNT(*) > 1

【讨论】:

  • ^ 不幸的是,没有返回任何行,这意味着没有重复项(正如我所怀疑的那样)。
【解决方案2】:

我认为您收到此错误的原因是因为表 2 具有相同 ID 的多行相同代码。

例如,表 2 可能有两行或多行 ID 1024 和代码“PSV”。

解决此问题的一个简单解决方案是按如下方式修改您的代码:

INSERT INTO Table3
SELECT DISTINCT ID, Code
FROM Table1
CROSS JOIN Table2
WHERE Some_conditions...

【讨论】:

  • ^ 我也试过了,但也无济于事——两条记录都没有重复。 ID 和代码都是重复的,但从不在一起。 1024 PSV、1027 PSV 和 1024 RFT 应该代表 3 个不同的 PK。
【解决方案3】:

SQL Server 为 Table3 创建了一个唯一的非聚集索引,阻止了 INSERT INTO 语句的执行。我使用 SQL Server Management Studio 对象资源管理器禁用了它,它允许我输入行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 2011-10-25
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    相关资源
    最近更新 更多