2012-07-10 94 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 
相關問題