首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新时的SQL约束IGNORE_DUP_KEY

问更新时的SQL约束IGNORE_DUP_KEY
EN

Stack Overflow用户
提问于 2010-08-03 18:52:25
回答 3查看 1.2K关注 0票数 1

我对IGNORE_DUP_KEY的一个表有一个约束。这允许批量插入在某些记录是复制记录而另一些记录不是复制记录的情况下部分工作(只插入非复制记录)。但是,它不允许更新部分工作,在那里我只想更新那些不会创建副本的记录。

有人知道我如何在应用更新时支持IGNORE_DUP_KEY吗?

我使用的是MS SQL 2005

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-03 21:15:37

如果我理解正确的话,您希望在不指定必要的WHERE逻辑的情况下进行更新,以避免创建重复项?

代码语言:javascript
复制
create table #t (col1 int not null, col2 int not null, primary key (col1, col2))

insert into #t 
select 1, 1 union all 
select 1, 2 union all 
select 2, 3

-- you want to do just this...
update #t set col2 = 1

-- ... but you really need to do this
update #t set col2 = 1
where not exists (
    select * from #t t2
    where #t.col1 = t2.col1 and col2 = 1
    )

脑海中浮现的主要选项是:

  1. 使用完整的UPDATE语句来避免创建重复的UPDATE
  2. 使用INSTEAD OF UPDATE触发器‘拦截’UPDATE,并且只执行不会创建重复的

的更新

  1. 使用逐行处理技术(如游标),并将每个更新包装在TRY...CATCH中...或任何与该语言等效的语言是

我认为没有人能告诉你哪一个是最好的,因为这取决于你想做什么,以及你在什么环境中工作。但是,因为逐行处理可能会产生一些误报,所以我将尝试使用基于集合的方法。

票数 1
EN

Stack Overflow用户

发布于 2010-08-03 20:44:13

我不确定到底发生了什么,但如果您在批量加载过程中插入重复项并更新主键,那么临时表可能是适合您的解决方案。您创建了一个在批量加载之前确保为空的表,然后使用来自文件的100%原始数据加载它,然后将这些数据处理到您的真实表中(set based是最好的)。您可以这样做来插入所有不存在的行:

代码语言:javascript
复制
INSERT INTO RealTable
        (pk, col1, col2, col3)
    SELECT
        pk, col1, col2, col3
        FROM StageTable s
        WHERE NOT EXISTS (SELECT
                              1
                              FROM RealTable r
                              WHERE s.pk=r.pk
                         )

首先,防止重复是最好的。你也可以通过加入临时表来更新你的实表,等等。这将避免“绕过”约束的需要。当您绕过这些约束时,通常很难找到bug。

票数 1
EN

Stack Overflow用户

发布于 2010-08-03 19:10:06

我有一种感觉,你应该使用MERGE语句,然后在更新部分,你真的不应该更新你想要唯一的键。这也意味着您必须在表中定义一个键是唯一的(设置唯一索引或定义为主键)。则具有重复键的任何更新或插入都将失败。

编辑:我认为这个链接会对此有所帮助:

http://msdn.microsoft.com/en-us/library/bb522522.aspx

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

https://stackoverflow.com/questions/3395797

复制
相关文章

相似问题

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