如何删除 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 的情况下完成所有操作,我说了一个方法,但您在使用它时应该小心:
- 遍历你的table
- 删除记录,如果有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
语句,您就可以删除所有未引用的行。
我有一个 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 的情况下完成所有操作,我说了一个方法,但您在使用它时应该小心:
- 遍历你的table
- 删除记录,如果有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
语句,您就可以删除所有未引用的行。