支援的版本: 目前 (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 / 7.2

3.6. 繼承 #

繼承是物件導向資料庫中的一個概念。它開闢了資料庫設計中令人感興趣的新可能性。

讓我們建立兩個表:一個名為 cities 的表和一個名為 capitals 的表。當然,首都在本質上也是城市,所以你希望在列出所有城市時,能以某種方式隱式地顯示首都。如果你真的很聰明,你可能會發明這樣的方案:

CREATE TABLE capitals (
  name       text,
  population real,
  elevation  int,    -- (in ft)
  state      char(2)
);

CREATE TABLE non_capitals (
  name       text,
  population real,
  elevation  int     -- (in ft)
);

CREATE VIEW cities AS
  SELECT name, population, elevation FROM capitals
    UNION
  SELECT name, population, elevation FROM non_capitals;

就查詢而言,這還算可以,但當你需要更新多行時,事情就會變得非常麻煩。

一個更好的解決方案是:

CREATE TABLE cities (
  name       text,
  population real,
  elevation  int     -- (in ft)
);

CREATE TABLE capitals (
  state      char(2) UNIQUE NOT NULL
) INHERITS (cities);

在這種情況下,capitals 表中的一行會繼承父表 cities 的所有欄位(namepopulationelevation)。欄位 name 的類型是 text,這是 PostgreSQL 中用於可變長度字串的原生類型。capitals 表還有一個額外的欄位 state,它顯示了該首都所屬的州/省縮寫。在 PostgreSQL 中,一個表可以繼承自零個或多個其他表。

例如,以下查詢會尋找所有海拔超過 500 英尺的城市名稱,包括州/省首府:

SELECT name, elevation
  FROM cities
  WHERE elevation > 500;

它會回傳:

   name    | elevation
-----------+-----------
 Las Vegas |      2174
 Mariposa  |      1953
 Madison   |       845
(3 rows)

另一方面,以下查詢會尋找所有不是州/省首府且海拔超過 500 英尺的城市:

SELECT name, elevation
    FROM ONLY cities
    WHERE elevation > 500;
   name    | elevation
-----------+-----------
 Las Vegas |      2174
 Mariposa  |      1953
(2 rows)

這裡 ONLYcities 之前表示該查詢應該只在 cities 表上執行,而不是在繼承層次結構中 cities 下面的表上執行。 我們已經討論過的許多指令 — SELECTUPDATEDELETE — 都支援這種 ONLY 標記法。

注意

雖然繼承通常很有用,但它尚未與唯一約束或外部鍵整合,這限制了它的用處。詳情請參閱第 5.11 節

提交更正

如果您在文件中發現任何不正確、與特定功能的使用體驗不符或需要進一步澄清的地方,請使用此表單報告文件問題。