2015-04-05 79 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语句,并且您摆脱了所有未引用的行。