1

外部キーを使用して1つのメインテーブルを参照するテーブルがいくつかあります。

私の目標は、メインテーブルから1つの包括的削除ステートメントを作成することです。これにより、データを外部キーとして持つすべてのステートメントも削除されます。

ただし、参照が他のテーブルから削除される前に削除されるため、予想どおりに制約エラーが発生します。データが外部キーとしても使用されているすべてのテーブルから削除したいことをSQLに伝える方法はありますか?

4

2 に答える 2

2

親テーブルの削除を参照テーブルにカスケードするには、ON DELETE CASCADE外部キーを使用します。ただし、メインテーブルからすべての行を削除する場合は、TRUNCATE;を使用して問題を解決するためのより良い方法があります。この投稿の最後を参照してください。

デフォルトの外部キーをALTER TABLEに変更ON DELETE NO ACTIONON 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によってグループに追加されたテーブルへの外部キー参照を持つすべてのテーブルを自動的に切り捨てます。

于 2012-10-29T01:06:34.657 に答える
1

DELETEステートメントを実行しているテーブルに外部キーがリンクされているテーブルにカスケードする唯一の方法はON DELETE CASCADE、キーにオプションを設定することです。ALTER TABLEステートメントを実行して、現在の値からこのオプションに変更する必要があります。 :

http://www.postgresql.org/docs/current/interactive/ddl-constraints.html

于 2012-10-29T01:06:47.683 に答える