INSERT INTO SELECT CROSS JOIN复合主键

时间:2015-08-06 20:43:03

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

我在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...

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

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

3 个答案:

答案 0 :(得分:2)

这将帮助您找到问题:

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

答案 1 :(得分:1)

我认为你得到这个错误的原因是因为表2有相同ID的相同代码的多行。

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

解决此问题的一个简单解决方案是修改代码,如下所示:

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

答案 2 :(得分:0)

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