Postgresql

DROP TABLE … CASCADE 不會刪除任何依賴表

  • May 30, 2016

我對 psql 還是比較陌生,當我決定嘗試刪除由於外鍵關係而導致其他表依賴的表時,我剛剛完成了一項任務。我的期望是,任何具有對我要刪除的表的外鍵引用的表都將(至少)刪除所有行,並且該表也將被刪除。此情況並非如此。這些表仍然存在,即使我指定CASCADE了,這些表的行也沒有發生任何變化。

但是TRUNCATE ... CASCADE在引用的表上使用實際上確實刪除了其他表中的行

編輯: 好的,我理解它這樣做是因為這是文件指定的方式,但我現在的問題是,這是什麼時候預期的行為?

  • 使用 CASCADE 刪除域會刪除使用該域的任何表中的每一列。
  • 刪除附有視圖的表將刪除該視圖。

為什麼刪除被其他表引用的表並不會刪除引用該表的表是有意義的?方便嗎?

DROP CASCADE 背後的想法是自動刪除依賴對象。這記錄在另一個答案所指的同一手冊頁上:

CASCADE

自動刪除依賴於表的對象(例如視圖)。

(強調我的。)

當您刪除由另一個表引用的表時,直接依賴於被刪除表的對像不是另一個表本身,而是在其上定義的外鍵約束。

因此,您觀察到的行為應該是預期的,因為它與您提到的其他情況一致:

  • DROP TABLE ... CASCADE刪除直接依賴於您要刪除的表的視圖。
  • DROP DOMAIN ... CASCADE刪除直接依賴於您要刪除的域的列。
  • TRUNCATE ... CASCADE也與上面的解釋一致,因為它刪除了行,並且依賴於行的對像只能是其他行,包括其他表的行——這就是為什麼引用表也被截斷1。

1我對其他表截斷的唯一問題是它們的外鍵可能定義在可空列上,但即使它們的某些行沒有引用 TRUNCATE 語句中指定的表,這些表仍然會被完全截斷。儘管如此,即使不一致,它也是記錄行為的方式:

CASCADE

自動截斷所有具有對任何命名表的外鍵引用的表,或者由於CASCADE.

引用自:https://dba.stackexchange.com/questions/117233