假设我有表A和B.表A与表B有FK。
我可以将B中的记录分类为“引用”和“未引用”,这意味着数据库中有一些记录分别具有指向该记录的FK。
我想找到一种与方案无关的方法来删除B中未引用的所有行。 在没有任何约束的情况下对表B执行简单的DELETE(因为我希望与方案无关,即一般方式),几乎可以肯定,它将失败。
如果它也可能是供应商独立会很好,但我觉得我要求太多了。
编辑:也许我不清楚。当我说我不想依赖于该方案时,我建议在执行'DELETE'时避免从其他表中命名列名。只删除B的记录,可以在不破坏数据库一致性的情况下删除。
答案 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语句。