我有一个表,其主键在多个表中使用。
我想在其他表中删除与FK无关的行。
如何从表中删除没有FK关系的所有行?
答案 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)
如果您想要在不检查所有其他相关表格的情况下完成所有操作,我会说方法,但您在使用时应该小心:
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 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
语句,就可以删除所有未引用的行。