| PostgreSQL 8.0.0 中文文件(轉譯自 PostgreSQL 中國 製作的簡體中文版本) | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 3. 高級特性 | Fast Forward | Next |
繼承是面向對象的資料庫的概念。它開啟了資料庫設計新的有趣的可能性大門。
讓我們建立兩個資料表:一個資料表 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 的所有字串(name, population,和 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, UPDATE 和 DELETE — 支援這個 ONLY 資料表示法。
注意: 儘管繼承經常是有用的,但是它還沒有集成唯一約束或者外鍵,因此制約了其實用性。 參閱 Section 5.5 獲取更多細節。