外部キーを使用して1つのメインテーブルを参照するテーブルがいくつかあります。
私の目標は、メインテーブルから1つの包括的削除ステートメントを作成することです。これにより、データを外部キーとして持つすべてのステートメントも削除されます。
ただし、参照が他のテーブルから削除される前に削除されるため、予想どおりに制約エラーが発生します。データが外部キーとしても使用されているすべてのテーブルから削除したいことをSQLに伝える方法はありますか?
外部キーを使用して1つのメインテーブルを参照するテーブルがいくつかあります。
私の目標は、メインテーブルから1つの包括的削除ステートメントを作成することです。これにより、データを外部キーとして持つすべてのステートメントも削除されます。
ただし、参照が他のテーブルから削除される前に削除されるため、予想どおりに制約エラーが発生します。データが外部キーとしても使用されているすべてのテーブルから削除したいことをSQLに伝える方法はありますか?
親テーブルの削除を参照テーブルにカスケードするには、ON DELETE CASCADE
外部キーを使用します。ただし、メインテーブルからすべての行を削除する場合は、TRUNCATE
;を使用して問題を解決するためのより良い方法があります。この投稿の最後を参照してください。
デフォルトの外部キーをALTER TABLE
に変更ON DELETE NO ACTION
ON DELETE CASCADE
できます。ON DELETE CASCADE
制約を削除してから、モディファイヤを使用して再作成します。外部キー制約構文についてはCREATE TABLE
、および 制約のドキュメントを参照してください。
簡単に言うと、代わりにcol coltype REFERENCES fktable(fkcol)
を使用しますcol coltype REFERENCES fktable(fkcol) ON DELETE CASCADE
。
それを使用ON DELETE CASCADE
して、漠然とまともなパフォーマンスを得るには、外部キー列にインデックスを作成することが重要です。それでも、ターゲットテーブルからの一括削除の場合、カスケードに依存するよりも、最初に各外部キー参照テーブルから移動して削除する方がはるかに高速であることがよくあります。
ON UPDATE CASCADE
を使用している場合も使用することをお勧めしますON DELETE CASCADE
。
メインテーブルからすべての行を削除する場合は、それらの選択だけでなく、テーブルを次のように切り捨てたTRUNCATE ... CASCADE
方がよいでしょう。
CASCADE
名前付きテーブルのいずれか、またはCASCADEによってグループに追加されたテーブルへの外部キー参照を持つすべてのテーブルを自動的に切り捨てます。
DELETE
ステートメントを実行しているテーブルに外部キーがリンクされているテーブルにカスケードする唯一の方法はON DELETE CASCADE
、キーにオプションを設定することです。ALTER TABLE
ステートメントを実行して、現在の値からこのオプションに変更する必要があります。 :
http://www.postgresql.org/docs/current/interactive/ddl-constraints.html