2012-07-10 131 views
0

可能重复:
Finding duplicate values in a SQL table如何查找sql​​表中是否存在唯一的对值?

我完全新的T-SQL和SQL一般,所以我希望有人能指导我在正确的方向规划。这里是我的问题..我有一个只有2列的表,AppliedBandwidthSourceKey和AppliedBandwithSource,为了简单起见,我将它们分别称为列A和B.

列A和B组成主键。当我尝试插入列A的值已存在的记录时,立即得到主键约束违规,并且如果列A不存在,但列B会得到唯一键约束违规。我的问题是如何检查表中是否存在“值对”?如果没有,那么就不要插入任何东西

我见过几种使用tsql的合并类似问题的解决方案,如果不存在语句,但我无法理解这个概念。任何帮助将不胜感激。

+0

如果列A和B组成的主键和您将得到一个唯一的键违反约束,那么在B列上必须有一个唯一的键。主键必须是唯一的,但只要没有a值,您可以在列A或B中具有相同的值在表A中已经存在的列A和B中。我会检查桌子上的索引 - 我想不出在两列上有PK的好理由,并且对其中一个列有唯一的限制。或者,也许你刚刚混合了PK和索引(或者DBA疯了!) – Charleh 2012-07-10 15:38:56

+0

我可能错误地指出了这个问题。看起来这两个领域应该是单独的独特的,我与PK和索引混在一起。 – 2012-07-10 16:36:42

+0

在这种情况下,它听起来像是你需要一个唯一的值** BOTH ** PK和唯一键 - 因为你得到了PK违规,我会说PK是A列,唯一的键是B列 - 但是你说你只想知道一个特定的组合是否存在......有点混淆这个! – Charleh 2012-07-10 16:52:14

回答

1

你实际上并不需要先完成这项工作。 。 。毕竟,这就是约束所做的事情。

相反,了解try/catch块:

begin try 
    insert into t(a, b) values('a', 'b') 
end try 
begin catch 
    print 'Oops! There was a problem, maybe a constraint violation for example' 
end catch; 

此语句尝试插入。如果出现故障,则进入“catch”部分,并且可以做任何你想做的事情(包括忽略问题)。该文档相当清楚(http://msdn.microsoft.com/en-us/library/ms175976.aspx)。

+0

如果插入由于另一个问题例如数据库已关闭;) – 03Usr 2012-07-10 15:39:29

+0

您可以通过查看错误消息和错误代码来检查所有您喜欢的条件。 – 2012-07-10 15:41:07

1

你可以这样做:

IF NOT EXISTS (select * from yourtable where yourfield1 = 'field1' and yourfield2 = 'field2') 
BEGIN 
    INSERT INTO ... 
END 

如果数据没有发现这只是将数据插入yourtable。

0

使用计数统计其中(A和B)如果计数返回0,则该对不存在。如果它返回一个不是0(X)的数字,则该条目对存在(X)次。

0

在某些情况下,你可以使用左/右连接,在那里你加入你的PK的:

insert into tableA (Id,AnotherId) 
select b.Id, b.AnotherId 
from tableB b 
left join tableA a 
    on b.Id = a.id 
     and b.AnotherId = a.AnotherId 
where a.Id is null 

另一个左连接的版本:

insert into tableA (Id,AnotherId) 
select b.Id, b.AnotherId 
from (select Id = 5, AnotherId = 5) b 
left join tableA a 
    on b.Id = a.id 
     and b.AnotherId = a.AnotherId 
where a.Id is null 
and a.Id is null