【发布时间】:2016-05-18 14:59:46
【问题描述】:
假设我有一个空的ProductLocalizations 表,其中有一个由ProductId 和LanguageCode 字段组成的复合主键,我执行以下查询。
INSERT INTO dbo.ProductLocalizations (ProductId, LanguageCode, Name, Description)
SELECT ProductId, LanguageCode1, Name1, Description1 FROM dbo.BulkProducts
WHERE ProductId NOT IN (SELECT ProductId FROM dbo.ProductLocalizations) UNION
SELECT ProductId, LanguageCode2, Name2, Description2 FROM dbo.BulkProducts
WHERE ProductId NOT IN (SELECT ProductId FROM dbo.ProductLocalizations) UNION
SELECT ProductId, LanguageCode3, Name3, Description3 FROM dbo.BulkProducts
WHERE ProductId NOT IN (SELECT ProductId FROM dbo.ProductLocalizations) UNION
SELECT ProductId, LanguageCode4, Name4, Description4 FROM dbo.BulkProducts
WHERE ProductId NOT IN (SELECT ProductId FROM dbo.ProductLocalizations)
根据我的(有限的)SQL 知识,因为查询包含
WHERE ProductId NOT IN (SELECT ProductId FROM dbo.ProductLocalizations)
子句,不应该有任何方法可以插入重复(无效)的记录。但是,执行此操作时,我会收到
消息 2627,级别 14,状态 1,第 1 行违反主键 约束“PK_dbo.ProductLocalizations”。无法插入重复键 在对象“dbo.ProductLocalizations”中。重复键值为 (29977,德)。声明已终止。
我错过了什么?
【问题讨论】:
-
如果
BulkProducts和BulkProdu有共同的ProductIdex:100 而在ProductLocalizations表中不存在怎么办。 -
另外,您似乎在
ProductLocalizations表中有复合主键,因此您需要检查ProductId + another column是否存在 -
检查
LanguageCode1是否与LanguageCode2或其他ProductId不同 -
@Prdp
BulkProdu实际上是BulkProducts,抱歉打错了。 @Squirrel 检查,我的BulkProducts表中只有几条记录,它们显然不一样。 -
我的意思是这也是一种可能性。
标签: sql sql-server database