5.10. 依賴性追蹤

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

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

DROP TABLE products;

NOTICE:  constraint $1 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 之前的外鍵約束依賴性和序列字段依賴性 在升級過程中都不會得到維護或者創建。所有其它的依賴性類型 在升級過程中都將得到恰當的創建。