標籤:
如果你建立了一個包含許多表,並且帶有外鍵約束、視圖、觸發器、函數等複雜的資料庫結構。那麼你就會在對象之間隱含地建立了一個依賴性的網路。比如,一個帶有外鍵約束的表依賴於它所引用的表。
為了保證整個資料庫結構的完整性,PostgreSQL 保證你無法刪除那些還被其它對象依賴的對象。比如,試圖刪除在裡被訂單表所依賴的產品表是不能成功的,會有類似下面的錯誤訊息出現:
DROP TABLE products;NOTICE: constraint orders_product_no_fkey on table orders depends on table productsERROR: cannot drop table products because other objects depend on itHINT: Use DROP ... CASCADE to drop the dependent objects too.
這個錯誤訊息包含一個有用的提示:如果你不想麻煩的分別刪除所有依賴對象,你可以運行:
DROP TABLE products CASCADE;
然後所有被依賴的對象都將被刪除(並不刪除訂單表,只是刪除外鍵約束)。如果你想檢查DROP ... CASCADE會幹什麼,運行不帶CASCADE 的DROP然後閱讀NOTICE訊息。
PostgreSQL裡的所有刪除命令都支援聲明CASCADE。當然,具體的依賴性實體取決於對象的類型。你也可以寫RESTRICT 而不是CASCADE以擷取預設的行為(防止刪除那些其它對象所依賴的對象)。
注意: 根據 SQL 標準,要求至少聲明RESTRICT或CASCADE中的一個。實際上沒有哪種資料庫系統強制這一點,但是預設的行為是RESTRICT 還是CASCADE則因系統而異。
注意: 在PostgreSQL 7.3之前的外鍵約束依賴性和序欄欄位依賴性在升級過程中都不會得到維護或者建立。所有其它的依賴性類型在從7.3版本以前的資料庫升級過程中都將得到恰當的建立。
PostgreSQL表依賴性跟蹤