如何删除没有FK关系的表中的所有行

时间:2015-04-05 05:08:59

标签: sql sql-server tsql sql-delete

我有一个表,其主键在多个表中使用。

我想在其他表中删除与FK无关的行。

如何从表中删除没有FK关系的所有行?

3 个答案:

答案 0 :(得分:2)

首先你可以这样选择:

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
)

答案 1 :(得分:2)

如果您想要在不检查所有其他相关表格的情况下完成所有操作,我会说方法,但您在使用时应该小心:

  1. 循环通过你的桌子
  2. 删除记录,如果存在任何FK,则记录不会 删除(使用TRY/CATCH块)
  3. 这样你就不需要检查所有的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 ID=@ID
        END TRY
        BEGIN CATCH
        END CATCH
    
        Delete FROM #Tmp Where Id = @Id
    
    End
    

答案 2 :(得分: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语句,就可以删除所有未引用的行。