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

How to delete all rows from table which has no FK relation

我有一个 table,它的主键在多个 table 中使用。

我想删除其他table中没有关系FK的行。

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

首先你可以select这样:

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
)

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

  1. 遍历你的table
  2. 删除记录,如果有FK则记录不存在 删除(使用 TRY/CATCH 块)

这样就不需要检查所有的fk和tables

注意:这种方式假定级联删除被禁用。

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

它不漂亮,但应该可以:

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;

您将对主 table 进行 table 扫描(您想检查每一行),但是只要在其他任何 table 中找到任何引用,这些扫描停止并且主 ID 被拒绝。如果其他每个 table 中的 FK 列都已编入索引,则将查找这些列。任何使它一直通过的东西都是一个 ID 值,在任何 table 中都没有引用。

现在只需将上面的查询提供给 delete 语句,您就可以删除所有未引用的行。