繼承是面向物件資料庫中的一個概念。它為資料庫設計開闢了有趣的新的可能性。
讓我們建立兩個表: 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 節。
如果您在文件中發現任何不正確、與您在使用特定功能時的經驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。