web-dev-qa-db-ja.com

DROP TABLE ... CASCADEは依存テーブルを削除しません

私はまだpsqlに比較的慣れていないので、外部キーの関係が原因で他のテーブルが依存しているテーブルを削除することを試みることに決めたとき、割り当てを終えたところです。私が期待しているのは、削除するテーブルへの外部キー参照を持つテーブルでは、(少なくとも)すべての行が削除され、テーブルも削除されることでした。これは事実ではありませんでした。テーブルはまだ存在し、CASCADEを指定しても、それらのテーブルの行は何も起こりませんでした。

ただし、TRUNCATE ... CASCADE参照されるテーブルで実際に他のテーブルの行を削除します

EDIT:わかりました。これは、ドキュメントで指定されている方法だからですが、私の質問今は、いつこれが予期される動作になるのですか?

  • CASCADEでドミアンを削除すると、そのドメインを使用するテーブルのすべての列が削除されます。
  • ビューがアタッチされているテーブルを削除すると、ビューが削除されます。

他のテーブルによって参照されているテーブルを削除しても、このテーブルを参照しているテーブルも削除されないのはなぜですか?

4
smac89

DROP CASCADEの背後にある考え方は、依存オブジェクトを自動的に削除することです。これは その他の回答 が参照している同じ マニュアルページ に記載されています。

CASCADE

自動的に削除テーブルに依存するオブジェクト(ビューなど)。

(エンファシス鉱山。)

別のテーブルによって参照されているテーブルを削除する場合、削除されるテーブルに直接依存するオブジェクトは、他のテーブル自体ではなく、それに定義されている外部キー制約です。

ですから、あなたが観察している振る舞いはあなたが言及した他のケースと一貫しているので期待されるべきです:

  • DROP TABLE ... CASCADEは、削除するテーブルに直接依存するビューを削除します。

  • DROP DOMAIN ... CASCADEは、削除するドメインに直接依存する列を削除します。

  • TRUNCATE ... CASCADEは、行を削除するため、上記の説明とも一致します。行に依存するオブジェクトは、他のテーブルの行を含む他の行のみになる可能性があります。そのため、参照するテーブルも切り捨てられます1


1他のテーブルの切り捨てに関する唯一の問題は、それらの外部キーがnull許容列に定義されている可能性があるにもかかわらず、テーブルが 行の一部がTRUNCATEで指定されたテーブルを参照していない場合でも完全に切り捨てられることですステートメント 。それでも、それが不整合であったとしても、それは振る舞いがどのようであるかです 文書化

CASCADE

名前付きテーブルのいずれか、またはCASCADEが原因でグループに追加されたテーブルへの外部キー参照を持つすべてのテーブルを自動的に切り捨てます。

2
Andriy M

これは ドキュメント化の方法

CASCADEは従属ビューを完全に削除しますが、外部キーの場合は外部キー制約のみを削除します、他のテーブル全体ではありません。

強調鉱山