我在IGNORE_DUP_KEY表上有一個約束。這允許批量插入部分工作,其中一些記錄是愚蠢的,而有些則不是(僅插入非愚蠢)。但是,它不允許更新部分工作,我只希望更新那些不會創建模糊的記錄。更新中的SQL約束IGNORE_DUP_KEY
有誰知道如何在應用更新時支持IGNORE_DUP_KEY?
我使用MS SQL 2005
我在IGNORE_DUP_KEY表上有一個約束。這允許批量插入部分工作,其中一些記錄是愚蠢的,而有些則不是(僅插入非愚蠢)。但是,它不允許更新部分工作,我只希望更新那些不會創建模糊的記錄。更新中的SQL約束IGNORE_DUP_KEY
有誰知道如何在應用更新時支持IGNORE_DUP_KEY?
我使用MS SQL 2005
如果我理解正確,你想要更新而不指定必要的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
)
浮現在腦海中的主要選項有:
我不認爲任何人都可以告訴你哪一個是最好的,因爲這取決於你想要做什麼以及你在哪個環境工作。但是,由於逐行處理可能會產生一些誤報,我會盡量堅持一套基於集合的方法。
我中有你應該使用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
)
防止了擺在首位重複是最好的。你也可以通過加入登臺表等等來對你的真實表進行更新。這樣可以避免需要「解決」約束條件。當你解決約束時,通常會創建難以發現的錯誤。
我希望有一些類似於IGNORE_DUP_KEY的機制,但更新。唉,我將不得不使用上面的第一個選項。非常感謝。 – DEH 2010-08-05 09:35:46