2015-04-05 69 views

回答

1

首先,你可以選擇這樣的:

select * from some_table where some_fk_column not in (
    select some_column from second_table 
) 

如果你得到好的結果,然後

delete from some_table where some_fk_column not in (
    select some_column from second_table 
) 
+0

這也可能遭受級聯刪除問題的困擾。在不檢查其他表的參考_before_刪除行時,可能會觸發級聯刪除。如果級聯刪除被禁用,那麼它不應該是一個問題。 – HABO 2015-04-05 13:44:27

2

如果你想要做的一切,不檢查所有其他相關的表我說的方式,但你使用時應小心:

  1. 通過您的表循環
  2. 以這種方式刪除的記錄,如果有的話FK是存在,那麼這個記錄不會 刪除(使用TRY/CATCH塊)

你並不需要檢查所有FK和表

注意:這方式假定級聯刪除被禁用。

Select * 
Into #Tmp 
From YOUR_TABLE 

Declare @Id int 

While EXISTS(SELECT * From #Tmp) 
Begin 

    Select Top 1 @Id = Id From #Tmp 

    BEGIN TRY 
     DELETE FROM YOUR_TABLE WHERE [email protected] 
    END TRY 
    BEGIN CATCH 
    END CATCH 

    Delete FROM #Tmp Where Id = @Id 

End 
+0

你認爲級聯刪除可能會讓OP感到驚訝嗎?它們可能無法啓用,但值得一提。 – HABO 2015-04-05 13:41:53

+0

@HABO你是對的,我忘了提及它,回答編輯。謝謝。 – jfun 2015-04-05 14:00:02

0

這是不漂亮,但它應該工作:

select m.ID 
from  mastertable m 
where not exists(select 1 from table1 where fk_id = m.ID) 
    and not exists(select 1 from table2 where fk_id = m.ID) 
    and not exists(select 1 from table3 where fk_id = m.ID) 
    and not exists(select 1 from table4 where fk_id = m.ID) 
    and so on; 

你會做的主表的表掃描(你要檢查每一行),但只要任何引用在任何其他表中找到,那些掃描停止,並且主ID被拒絕。如果其他每個表中的FK列都被編入索引,那麼這些將被搜索。任何能夠一直貫穿的事物都是一個在任何表格中都沒有引用的ID值。

現在只需將上面的查詢提供給delete語句,並且您擺脫了所有未引用的行。

相關問題