sql - 如何在 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
)
解决方案
尝试使用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 IN
是NULL
不安全的。如果子查询生成的任何NULL
值都是,则过滤掉所有行。
推荐阅读
- google-bigquery - 在 bigquery 中过滤嵌套数据
- c# - 未应用样式的动态 TextView 的边距
- php - 有没有办法在 Laravel 中全局验证电话号码?
- sql - 如何使用字符串的顺序创建跨行的累积字符串连接?
- html - 带有css的html代码在outlook中不起作用
- python - textwrap 模块的问题:如何在段落中格式化文本文件
- cassandra - 单个 docker-swarm 节点上的 Cassandra 副本
- obiee - 主从关系:在钻取之前将详细信息显示为空
- python - 如何使用 open() 在 python 中打开具有相对路径的文件?
- java - 多线程:多个线程与同一个表交互