2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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)

這裡的 ONLY 放在 cities 前面,表示查詢應該只針對 cities 表執行,而不是 cities 在繼承層次結構中的子表。我們已經討論過的許多命令(如 SELECTUPDATEDELETE)都支援這種 ONLY 表示法。

注意

儘管繼承非常有用,但它尚未與唯一約束或外部索引鍵整合,這限制了它的實用性。有關更多詳細資訊,請參閱 第 5.11 節

提交更正

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