| PostgreSQL 7.4 文檔 | ||||
|---|---|---|---|---|
| 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 表示法。