Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL约束在更新时忽略重复键_Sql_Sql Server_Sql Server 2005_Updates - Fatal编程技术网

SQL约束在更新时忽略重复键

SQL约束在更新时忽略重复键,sql,sql-server,sql-server-2005,updates,Sql,Sql Server,Sql Server 2005,Updates,我对带有IGNORE_DUP_键的表有一个约束。这允许批量插入在某些记录是重复记录而某些记录不是重复记录的情况下部分工作(仅插入非重复记录)。但是,它不允许部分更新工作,我只希望更新那些不会创建复制的记录 有人知道我如何在应用更新时支持IGNORE_DUP_KEY吗 我使用的是MS SQL 2005我觉得您应该使用MERGE语句,然后在更新部分中,您真的不应该更新希望具有唯一性的密钥。这也意味着您必须在表中定义一个键是唯一的(设置唯一索引或定义为主键)。然后,任何使用重复密钥的更新或插入都将失败

我对带有IGNORE_DUP_键的表有一个约束。这允许批量插入在某些记录是重复记录而某些记录不是重复记录的情况下部分工作(仅插入非重复记录)。但是,它不允许部分更新工作,我只希望更新那些不会创建复制的记录

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


我使用的是MS SQL 2005

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

编辑:我认为此链接将有助于:


我不确定到底发生了什么,但是如果您在批量加载过程中插入重复项并更新主键,那么暂存表可能是您的解决方案。创建一个表,确保在大容量加载之前该表为空,然后使用文件中的100%原始数据加载该表,然后将该数据处理到实际表中(最好是基于集合的)。可以执行以下操作以插入所有不存在的行:

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
                         )

首先防止重复是最好的。您还可以通过加入staging表等方式对实际表进行更新。这将避免“绕过”约束的需要。当您处理约束时,通常会创建难以发现的bug。

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

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
    )
我想到的主要选择是:

  • 使用完整的UPDATE语句避免创建重复语句
  • 使用INSTEAD OF UPDATE触发器“拦截”更新,并且只执行不会创建重复的更新
  • 使用逐行处理技术,如游标,并在TRY…CATCH。。。或是其他语言的等价物

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

    MERGE仅适用于MSSQL 2008,而DEH使用的是MSSQL 2005。我希望会有类似于忽略重复键的机制,但用于更新。唉,我将不得不使用您上面的第一个选项。非常感谢。