2013-01-20 109 views
0

假設我有表A和B.表A的FK表B.刪除未引用記錄

爲「引用」和「未引用的」,這意味着有一些記錄,我可以B中歸類記錄具有FK的數據庫分別指向該記錄或不指定該記錄。

我想找到一個與方案無關的方法刪除B中未被引用的所有行。 做一個簡單的刪除表B沒有任何約束(因爲我想是方案無關,即一般的方式),幾乎肯定會失敗。

如果它也可以獨立於供應商將是偉大的,但我覺得我要求太多。

編輯:也許我不清楚。當我說我不想依賴該方案時,我提到避免在執行「刪除」時從其他表中命名列名。只需刪除可以刪除而不破壞數據庫一致性的B的記錄。

+0

你是什麼意思'我不想依靠這個計劃。我想要一個普通的方式。「? –

+0

我編輯了這個問題。 –

+1

「*我指的是避免從其他表中命名列名*」 - 這是不可能的。你**有**之間有某種「關係」,他們通過比較列完成。 –

回答

0

較慢的方式:

declare del_cur cursor 
local 
forward_only 
static 
scroll_locks 
for 
    select 0 from B 
; 

declare @foo int; 

open del_cur; 

fetch next from del_cur into @foo; 
while @@fetch_status = 0 
begin 
    begin try 
    delete from B where current of del_cur; 
    end try 
    begin catch 
    -- It was referenced, skip 
    end catch; 

    fetch next from del_cur into @foo; 
end; 

close del_cur; 
deallocate del_cur; 

一個更快的方法是研究現有的外鍵和建設,包括其列名的動態SQL語句。

+0

好,慢的方式,但工作!我會對動態SQL語句感興趣。你可以擴展一下這個解決方案或提供一些參考? –

+0

@peterRit查詢給定「OBJECT_ID(table_name)」存在的[外鍵列表](http://technet.microsoft.com/en-us/library/ms189807.aspx),它給出了列名。有一個列名稱列表,建立一個動態的'從B刪除,其中colname1爲空,colname2爲空且colname3爲空。 – GSerg

+0

不錯,我會檢查一下。 –