繼承是物件導向資料庫中的一個概念。它開闢了資料庫設計中令人感興趣的新可能性。
讓我們建立兩個表:一個名為 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
的所有欄位(name
、population
和 elevation
)。欄位 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
下面的表上執行。 我們已經討論過的許多指令 — SELECT
、UPDATE
和 DELETE
— 都支援這種 ONLY
標記法。
雖然繼承通常很有用,但它尚未與唯一約束或外部鍵整合,這限制了它的用處。詳情請參閱第 5.11 節。
如果您在文件中發現任何不正確、與特定功能的使用體驗不符或需要進一步澄清的地方,請使用此表單報告文件問題。