11

私は2つのテーブルを持っています

TableOne (TABLE_ONE_ID (pk), TABLE_TWO_ID (fk), ...(something else) )
TableTwo (TABLE_TWO_ID (pk), TABLE_ONE_ID (fk), ...(something else) )

これらのテーブルからレコードを削除するにはどうすればよいですか?

PS 設計が悪いと思いますが、これは私のせいではなく、データベース構造を変更する権限がありません。これらのテーブルからレコードを削除する方法を知る必要があります。

4

3 に答える 3

17

これについての最善の方法はわかりませんが、おそらく次のようなことをするでしょう:

UPDATE TableOne SET TABLE_TWO_ID = null;
DELETE FROM TableTwo;
DELETE FROM TableOne;
于 2012-08-31T09:39:32.807 に答える
7

外部キーの 1 つを延期するか、NULL を割り当てて (NULL 可能であると仮定して) サイクルを中断します。

ところで、どのようにデータを挿入していますか? そこでもそのサイクルを断ち切るために何かをしたに違いありません。

注: 慎重に制御された 1 つのセッションだけがデータベースを変更している場合は、FK を無効化または削除しても問題ありませんが、他のクライアントが期待する FK が適用されなくなったことを認識していない可能性がある同時環境では、データが破損する可能性があります。 .

于 2012-09-01T04:29:22.773 に答える
7

次の方法で外部キーを無効にできます。

alter table TableOne disable constraint fk_table_two_id;

その後、行を削除できるはずです。

DaveCosta のコメントによると、制約チェックを延期できます。このようにして、個々の SQL ステートメントではなく、トランザクション全体にわたって制約がチェックされます。例えば:

begin transaction;
set constraints all deferred; 
delete from TableTwo;
delete from TableOne;
commit transaction;
于 2012-08-31T09:39:16.013 に答える