首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >违反SQL Server 2005上INSERT WHERE COUNT(*) =0上的唯一键约束

违反SQL Server 2005上INSERT WHERE COUNT(*) =0上的唯一键约束
EN

Stack Overflow用户
提问于 2010-09-25 00:55:48
回答 3查看 41.9K关注 0票数 24

我从多个进程插入到SQL数据库中。这些进程有时可能会尝试将重复数据插入到表中。我尝试用一种可以处理重复项的方式来编写查询,但我仍然得到:

代码语言:javascript
复制
System.Data.SqlClient.SqlException: Violation of UNIQUE KEY constraint 'UK1_MyTable'. Cannot insert duplicate key in object 'dbo.MyTable'.
The statement has been terminated.

我的查询类似于:

代码语言:javascript
复制
INSERT INTO MyTable (FieldA, FieldB, FieldC)
SELECT FieldA='AValue', FieldB='BValue', FieldC='CValue'
WHERE (SELECT COUNT(*) FROM MyTable WHERE FieldA='AValue' AND FieldB='BValue' AND FieldC='CValue' ) = 0

约束'UK1_MyConstraint‘表示在MyTable中,3个字段的组合应该是唯一的。

我的问题:

  1. 为什么此操作不起作用?
  2. 我需要进行哪些修改才能避免因违反约束而出现异常?

请注意,我知道还有其他方法可以解决“如果不存在则插入”的原始问题,例如(总结):

使用TRY CATCH INSERT IF NOT EXIST INSERT(在具有可序列化隔离的事务内)

我应该使用其中一种方法吗?

用于创建表的编辑1 SQL:

代码语言:javascript
复制
CREATE TABLE [dbo].[MyTable](
  [Id] [bigint] IDENTITY(1,1) NOT NULL,
  [FieldA] [bigint] NOT NULL,
  [FieldB] [int] NOT NULL,
  [FieldC] [char](3) NULL,
  [FieldD] [float] NULL,
  CONSTRAINT [PK_MyTable] PRIMARY KEY NONCLUSTERED 
  (
    [Id] ASC
  )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON),
  CONSTRAINT [UK1_MyTable] UNIQUE NONCLUSTERED 
  (
    [FieldA] ASC,
    [FieldB] ASC,
    [FieldC] ASC
  )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
)

编辑2决定:

更新一下--我决定使用链接问题(link)中建议的"JFDI“实现。尽管我仍然很好奇为什么原来的实现不能工作。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3789287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档