首页 > 解决方案 > 如何在 SQL 表中插入时检查聚集的唯一键

问题描述

如果查询中没有 where 条件,我正在尝试将另一个数据库表中的行插入到新数据库表中,得到以下错误。

违反 UNIQUE KEY 约束“NK_LkupxViolations”。无法在对象“dbo.LkupxViolation”中插入重复键。重复键值为(00000000-0000-0000-0000-000000000000,(未指定))。

然后我编写了下面的查询,添加了它工作的条件,但它没有插入预期的编号。的行。

IF EXISTS(SELECT 1 FROM sys.tables WHERE name = 'LkupxViolation')
BEGIN
   INSERT INTO dbo.[LkupxViolation] SELECT * FROM  [DMO_DB].[dbo].[LkupxViolation] where CGRootId not in (select CGRootId from dbo.[LkupxViolation])
   and Name not in (select name from dbo.[LkupxViolation])
END
ELSE 
PRINT 'LkupxViolation table does not exist'

表中的唯一键创建为:

CONSTRAINT [NK_LkupxViolations] UNIQUE CLUSTERED
(
    [CGRootId] ASC,
    [Name] ASC
)

标签: sqlsql-server

解决方案


尝试使用NOT EXISTS

INSERT INTO dbo.[LkupxViolation]
    SELECT *
    FROM  [DMO_DB].[dbo].[LkupxViolation] remove_l
    WHERE NOT EXISTS (SELECT 1
                      FROM dbo.[LkupxViolation] local_l
                      WHERE local_l.Name = remote_l.Name AND
                            local_l.CGRootId = remote_l.CGRootId
                     );

这将检查同一行中的两个值。另外,NOT INNULL不安全的。如果子查询生成的任何NULL值都是,则过滤掉所有行。


推荐阅读