2015-04-23 39 views
0

我想我想要UNIQUEIGNORE_DUP_KEY的语义。忽略唯一约束并仍插入其他行

我有一个INSERT查询查看最近的数据并插入一个唯一的键值对。它经常运行,最多只需要几秒钟。

我有另一个INSERT查询查看所有数据并插入唯一的键值对。运行需要几分钟的时间,并且可能找不到任何事情,除了它有时会看到与最近查询相同的数据,并且会决定插入同一对。

我已经实现了一个UNIQUE约束,所以这本身并不是问题,但是我希望插入长时间运行的查询所确定的其他记录,而不管重复。

两个查询不明确也有类似的条款,以

WHERE NOT EXISTS (SELECT Key, Value From TargetTable TT 
    WHERE TT.Key = Result.Key AND TT.Value = Result.Value) 
+0

如果我理解正确的话,可能是你正在寻找 – ughai

+0

你能打破成两种不同工艺填充,然后两个独立的表这对'键,Value'独特的过滤指数仅最近过滤后的数据一个视图,即使该行存在于两个表中,也会出现只存在一行的错觉(喜欢快速过程中的行)? –

回答

0

我决定第二查询拆分成两个,让我现在有三个疑问:

  • 快速15分钟跑过去每30秒查询。
  • 快速查询回顾午夜UTC;可能有重复的关键失败,但重试不会很长;每2分钟运行一次。
  • 缓慢查询查看所有数据,但忽略当前UTC日期;将不会有重复的关键失败;每天运行两次。
1

如果我理解正确的话,你想要的东西,如MySQL的INSERT IGNORE。我不相信这个功能存在于SQL Server中。您的特定问题似乎是更新过程中发生的更新(或其他表),引入重复密钥。

一个选项是在此操作过程中对表进行锁定,不允许任何其他操作。考虑到锁的时间限制,这可能是不可行的。

另一种选择是采取长时间运行的查询并将结果存储到临时表中。然后,从这张表中逐个插入,捕获并忽略任何违反唯一约束的情况。