从表中删除未引用的记录

时间:2013-01-20 13:17:03

标签: sql sql-server delete-row

假设我有表A和B.表A与表B有FK。

我可以将B中的记录分类为“引用”和“未引用”,这意味着数据库中有一些记录分别具有指向该记录的FK。

我想找到一种与方案无关的方法来删除B中未引用的所有行。 在没有任何约束的情况下对表B执行简单的DELETE(因为我希望与方案无关,即一般方式),几乎可以肯定,它将失败。

如果它也可能是供应商独立会很好,但我觉得我要求太多了。

编辑:也许我不清楚。当我说我不想依赖于该方案时,我建议在执行'DELETE'时避免从其他表中命名列名。只删除B的记录,可以在不破坏数据库一致性的情况下删除。

1 个答案:

答案 0 :(得分:0)

缓慢的方式:

declare del_cur cursor
local
forward_only
static
scroll_locks
for
  select 0 from B
;

declare @foo int;

open del_cur;

fetch next from del_cur into @foo;
while @@fetch_status = 0
begin
  begin try
    delete from B where current of del_cur;
  end try
  begin catch
    -- It was referenced, skip
  end catch;

  fetch next from del_cur into @foo;
end;

close del_cur;
deallocate del_cur;

更快的方法是检查现有的外键并构建包含其列名的动态SQL语句。