0

テーブルAとBがあるとします。テーブルAにはテーブルBへのFKがあります。

Bのレコードを「参照済み」と「非参照済み」に分類できます。これは、データベースに、それぞれそのレコードを指すFKを持つレコードがあることを意味します。

参照されていないBのすべての行を削除するスキームに依存しない方法を見つけたいと思います。制約なしでテーブルBの単純なDELETEを実行すると(スキームに依存しない、つまり一般的な方法であるため)、ほぼ確実に失敗します。

ベンダーに依存しないこともできれば素晴らしいのですが、私はあまりにも多くを求めていると感じています。

編集:多分私は明確ではありませんでした。スキームに依存したくないと言うときは、「DELETE」を実行するときに他のテーブルから列名に名前を付けないようにすることを参照します。DBの整合性を損なうことなく削除できるBのレコードを削除するだけです。

4

1 に答える 1

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ステートメントを作成することです。

于 2013-01-20T13:39:02.777 に答える