支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3

5.15. 相依性追蹤 #

當您建立複雜的資料庫結構,其中包含許多具有外部鍵約束、檢視表、觸發器、函數等的表格時,您會隱式地在物件之間建立一個相依性的網路。 例如,具有外部鍵約束的表格相依於它所參考的表格。

為了確保整個資料庫結構的完整性,PostgreSQL 確保您不能刪除其他物件仍然相依的物件。 例如,嘗試刪除我們在第 5.5.5 節中考慮的 products 表格,而 orders 表格相依於它,將導致如下錯誤訊息

DROP TABLE products;

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

錯誤訊息包含一個有用的提示:如果您不想費心個別刪除所有相依的物件,您可以執行

DROP TABLE products CASCADE;

所有相依的物件將會被移除,任何相依於它們的物件也會被遞迴地移除。 在此情況下,它不會移除 orders 表格,它只會移除外部鍵約束。 它會停在那裡,因為沒有任何東西相依於外部鍵約束。 (如果您想檢查 DROP ... CASCADE 將會做什麼,請在沒有 CASCADE 的情況下執行 DROP 並閱讀 DETAIL 輸出。)

幾乎所有 PostgreSQL 中的 DROP 指令都支援指定 CASCADE。 當然,可能相依性的性質會隨著物件的類型而變化。 您也可以寫 RESTRICT 而不是 CASCADE 來取得預設行為,也就是防止刪除任何其他物件相依的物件。

注意

根據 SQL 標準,在 DROP 指令中必須指定 RESTRICTCASCADE。 沒有任何資料庫系統實際執行該規則,但預設行為是 RESTRICT 還是 CASCADE,各系統之間有所不同。

如果 DROP 指令列出多個物件,則只有當指定群組之外存在相依性時才需要 CASCADE。 例如,當說 DROP TABLE tab1, tab2 時,從 tab2 參考 tab1 的外部鍵的存在並不表示需要 CASCADE 才能成功。

對於將主體定義為字串常值的使用者定義函數或程序,PostgreSQL 會追蹤與函數的外部可見屬性(例如其引數和結果類型)相關聯的相依性,但不會追蹤只能透過檢查函數主體才能知道的相依性。 作為一個例子,考慮以下情況

CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow',
                             'green', 'blue', 'purple');

CREATE TABLE my_colors (color rainbow, note text);

CREATE FUNCTION get_color_note (rainbow) RETURNS text AS
  'SELECT note FROM my_colors WHERE color = $1'
  LANGUAGE SQL;

(有關 SQL 語言函數的說明,請參閱第 36.5 節。) PostgreSQL 將會知道 get_color_note 函數相依於 rainbow 類型:刪除該類型將會強制刪除該函數,因為其引數類型將不再被定義。 但是 PostgreSQL 不會認為 get_color_note 相依於 my_colors 表格,因此如果表格被刪除,則不會刪除該函數。 雖然這種方法有缺點,但也有好處。 如果表格遺失,則該函數在某種意義上仍然有效,儘管執行它會導致錯誤; 建立一個相同名稱的新表格將允許該函數再次工作。

另一方面,對於以 SQL 標準樣式撰寫主體的 SQL 語言函數或程序,主體會在函數定義時被解析,並且儲存剖析器所辨識的所有相依性。 因此,如果我們將上面的函數寫成

CREATE FUNCTION get_color_note (rainbow) RETURNS text
BEGIN ATOMIC
  SELECT note FROM my_colors WHERE color = $1;
END;

那麼 DROP 將會知道並強制執行該函數對 my_colors 表格的相依性。

提交更正

如果您在文件中看到任何不正確、與您使用特定功能的體驗不符或需要進一步說明的內容,請使用此表單來報告文件問題。