?
このドキュメントでは、 php中國語ネットマニュアル リリース
繼承是面向?qū)ο蟮臄?shù)據(jù)庫的概念。它開啟了數(shù)據(jù)庫設計新的有趣的可能性大門。
首先,創(chuàng)建兩個表:一個cities
表和一個capitals
表。
自然,首府capitals
也屬于城市 cities
,因此在列出所有城市時需要通過某種方式來隱含地顯示出首府。
如果您對PostgreSQL數(shù)據(jù)庫足夠熟悉,您也可以像下面那樣自定義一些模式:
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 -- (in ft) ); CREATE TABLE capitals ( state char(2) ) INHERITS (cities);
在這個例子里,
子表(capitals
)繼承(inherits)
其父表(parent)的所有字段(name,population, altitude)。
這些字段(name)的類型文本(text)類型(一種PostgreSQL用于變長字符串的固有類型)。
首府會有一個額外的字段,state,用以顯示其所處的州。
在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的表。 許多我們已經(jīng)討論過的命令,如SELECT, UPDATE, DELETE都支持ONLY的使用。
Note: 盡管繼承經(jīng)常使用,但由于還沒有集成唯一性約束或者外鍵, 因此制約了其實用性。參閱Section 5.8 以獲取更多細節(jié)。