2010-08-03 41 views
1

我在IGNORE_DUP_KEY表上有一個約束。這允許批量插入部分工作,其中一些記錄是愚蠢的,而有些則不是(僅插入非愚蠢)。但是,它不允許更新部分工作,我只希望更新那些不會創建模糊的記錄。更新中的SQL約束IGNORE_DUP_KEY

有誰知道如何在應用更新時支持IGNORE_DUP_KEY?

我使用MS SQL 2005

回答

1

如果我理解正確,你想要更新而不指定必要的WHERE邏輯來避免重複創建?

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語句,以避免造成重複
  2. 使用INSTEAD和UPDATE觸發器爲「攔截」的更新僅做的UPDATE這將不會創建一個重複
  3. 使用逐行處理技術,如遊標和包裝每個更新在TRY ... CATCH ...或任何語言的等效是

我不認爲任何人都可以告訴你哪一個是最好的,因爲這取決於你想要做什麼以及你在哪個環境工作。但是,由於逐行處理可能會產生一些誤報,我會盡量堅持一套基於集合的方法。

+0

我希望有一些類似於IGNORE_DUP_KEY的機制,但更新。唉,我將不得不使用上面的第一個選項。非常感謝。 – DEH 2010-08-05 09:35:46

0

我中有你應該使用MERGE語句,然後在更新部分,你應該真的不更新你想擁有獨特的鍵感。這也意味着您必須在表中定義一個密鑰是唯一的(設置唯一索引或定義爲主鍵)。然後任何更新或用重複密鑰插入都將失敗。

編輯:我認爲這個鏈接將有助於對:

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

+1

MERGE僅適用於MSSQL 2008,並且DEH使用的是MSSQL 2005 – Pondlife 2010-08-03 12:24:03

+0

太糟糕了,但您是對的。 – hol 2010-08-03 13:31:15

0

我不知道究竟怎麼回事,但如果你是重複插入和更新主鍵作爲批量的一部分加載過程,那麼臨時表可能是您的解決方案。您可以創建一個在批量加載之前確定爲空的表格,然後使用文件中的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 
         ) 

防止了擺在首位重複是最好的。你也可以通過加入登臺表等等來對你的真實表進行更新。這樣可以避免需要「解決」約束條件。當你解決約束時,通常會創建難以發現的錯誤。