5.10. 依賴性追蹤

如果您建立了一個包含許多資料表,並且帶有外鍵約束,視圖, 觸發器,函數等等的複雜資料庫結構。那麼您就會在對像 之間隱含地建立了一個依賴性的網絡。比如,一個帶有外鍵 約束的資料表依賴於它引用的資料表。

為了保證整個資料庫結構的完整性,PostgreSQL 保證 您無法刪除那些還有其它對像依賴的對象。比如,試圖刪除我們在 Section 5.4.5 裡考慮的產品資料表,這個時候 訂單資料表仍然依賴它,這樣的刪除動作是不能成功的,會有類似下面的錯誤訊息出現:

DROP TABLE products;

NOTICE:  constraint orders_product_no_fkey on table orders depends on table products
ERROR:  Cannot drop table products because other objects depend on it
        Use DROP ... CASCADE to drop the dependent objects too

這個錯誤訊息包含一個有用的提示:如果您不想惹來分別刪除所有 依賴對象的麻煩,您可以執行

DROP TABLE products CASCADE;

然後所有被依賴的對象都將被刪除。在這種情況下, 它並不刪除訂單資料表,它只刪除外鍵約束。(如果您想檢查 DROP ... CASCADE 會幹什麼,執行不帶 CASCADEDROP然後閱讀 NOTICE 訊息。)

PostgreSQL 裡的所有刪除命令都 支援聲明 CASCADE。當然,具體的依賴性實體 取決於對象的類型。您也可以寫 RESTRICT,而 不是 CASCADE,以獲取預設的行為, 這個時候限制於刪除那些其它對像依賴的對象。

注意: 根據 SQL 標準,要求至少聲明 RESTRICT 或者 CASCADE 中的一個。 實際上沒有哪種資料庫系統是這麼實現的,但是預設的行為是 RESTRICT 還是 CASCADE 則因系統而異。

注意: PostgreSQL 7.3 之前的外鍵約束依賴性和序列字串依賴性 在升級過程中都不會得到維護或者建立。所有其它的依賴性類型 在升級過程中都將得到恰當的建立。