3.5. 繼承

繼承是面向對象的資料庫的概念。它開啟了資料庫設計新的有趣的可能性大門。

讓我們建立兩個資料表:一個資料表 cities 和一個資料表 capitals。自然,首府(capital)也是城市(cities), 因此在列出所有城市時您想要某種方法隱含地顯示首府。 如果您已經很高明了,那麼您可能會創造類似下面這樣的模式:

CREATE TABLE capitals (
    name            text,
    population      real,
    altitude        int,    -- (單位是英尺)
    state           char(2)
);

CREATE TABLE non_capitals (
    name            text,
    population      real,
    altitude        int     -- (單位是英尺)
);

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

如果只是查詢,那麼這個方法運轉得很好,比如如果您需要更新某幾行, 那這個方法就很難看了。

一種更好的方法是:

CREATE TABLE cities (
    name            text,
    population      real,
    altitude        int     -- (單位是英尺)
);

CREATE TABLE capitals (
    state           char(2)
) INHERITS (cities);

在這個例子裡,capitals 的一行繼承所有來自它的父資料表cities 的所有字串(namepopulation,和 altitude)。 字串 name 的類型是 text, 是 PostgreSQL 用於變長字元串的固有類型。 州首府有一個額外的字串,州,顯示所處的州。在 PostgreSQL 裡,一個資料表可以從零個或者更多其它資料表中繼承過來。

比如,下面的查詢找出所有海拔超過 500 英尺的城市的名字, 包括州首府:

SELECT name, altitude
    FROM cities
    WHERE altitude > 500;

它返回:

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

另外一方面,下面的查詢找出所有不是州首府並且位於海拔大於或等於 500 英尺的城市:

SELECT name, altitude
    FROM ONLY cities
    WHERE altitude > 500;

   name    | altitude
-----------+----------
 Las Vegas |     2174
 Mariposa  |     1953
(2 rows)

這裡的 cities 前面的 ONLY 指示系統只對 cities 資料表執行查詢,而不包括繼承級別中低於 cities 的資料表。 許多我們已經討論過的命令 — SELECT, UPDATEDELETE — 支援這個 ONLY 資料表示法。

注意: 儘管繼承經常是有用的,但是它還沒有集成唯一約束或者外鍵,因此制約了其實用性。 參閱 Section 5.5 獲取更多細節。