私はまだpsqlに比較的慣れていないので、外部キーの関係が原因で他のテーブルが依存しているテーブルを削除することを試みることに決めたとき、割り当てを終えたところです。私が期待しているのは、削除するテーブルへの外部キー参照を持つテーブルでは、(少なくとも)すべての行が削除され、テーブルも削除されることでした。これは事実ではありませんでした。テーブルはまだ存在し、CASCADE
を指定しても、それらのテーブルの行は何も起こりませんでした。
ただし、TRUNCATE ... CASCADE
参照されるテーブルで実際に他のテーブルの行を削除します
EDIT:わかりました。これは、ドキュメントで指定されている方法だからですが、私の質問今は、いつこれが予期される動作になるのですか?
他のテーブルによって参照されているテーブルを削除しても、このテーブルを参照しているテーブルも削除されないのはなぜですか?
DROP CASCADEの背後にある考え方は、依存オブジェクトを自動的に削除することです。これは その他の回答 が参照している同じ マニュアルページ に記載されています。
CASCADE
自動的に削除テーブルに依存するオブジェクト(ビューなど)。
(エンファシス鉱山。)
別のテーブルによって参照されているテーブルを削除する場合、削除されるテーブルに直接依存するオブジェクトは、他のテーブル自体ではなく、それに定義されている外部キー制約です。
ですから、あなたが観察している振る舞いはあなたが言及した他のケースと一貫しているので期待されるべきです:
DROP TABLE ... CASCADE
は、削除するテーブルに直接依存するビューを削除します。
DROP DOMAIN ... CASCADE
は、削除するドメインに直接依存する列を削除します。
TRUNCATE ... CASCADE
は、行を削除するため、上記の説明とも一致します。行に依存するオブジェクトは、他のテーブルの行を含む他の行のみになる可能性があります。そのため、参照するテーブルも切り捨てられます1。
1他のテーブルの切り捨てに関する唯一の問題は、それらの外部キーがnull許容列に定義されている可能性があるにもかかわらず、テーブルが 行の一部がTRUNCATEで指定されたテーブルを参照していない場合でも完全に切り捨てられることですステートメント 。それでも、それが不整合であったとしても、それは振る舞いがどのようであるかです 文書化 :
CASCADE
名前付きテーブルのいずれか、または
CASCADE
が原因でグループに追加されたテーブルへの外部キー参照を持つすべてのテーブルを自動的に切り捨てます。