?
本文檔使用 PHP中文網(wǎng)手冊(cè) 發(fā)布
繼承是面向?qū)ο蟮臄?shù)據(jù)庫(kù)的概念。它開啟了數(shù)據(jù)庫(kù)設(shè)計(jì)新的有趣的可能性大門。
首先,創(chuàng)建兩個(gè)表:一個(gè)cities
表和一個(gè)capitals
表。
自然,首府capitals
也屬于城市 cities
,因此在列出所有城市時(shí)需要通過某種方式來隱含地顯示出首府。
如果您對(duì)PostgreSQL數(shù)據(jù)庫(kù)足夠熟悉,您也可以像下面那樣自定義一些模式:
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;
如果只是查詢,那么這個(gè)方法會(huì)很實(shí)用,而如果要進(jìn)行更新,那么不推薦使用這個(gè)方法。
一種更好的方法是:
CREATE TABLE cities ( name text, population real, altitude int -- (in ft) ); CREATE TABLE capitals ( state char(2) ) INHERITS (cities);
在這個(gè)例子里,
子表(capitals
)繼承(inherits)
其父表(parent)的所有字段(name,population, altitude)。
這些字段(name)的類型文本(text)類型(一種PostgreSQL用于變長(zhǎng)字符串的固有類型)。
首府會(huì)有一個(gè)額外的字段,state,用以顯示其所處的州。
在PostgreSQL里,一個(gè)表可以從零個(gè)或者多個(gè)其它表中繼承過來。
比如,下面的查詢找出的是所有海拔超過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)
該插敘語(yǔ)句中cities前面的ONLY表明只對(duì)cities 表運(yùn)行查詢, 而不包括繼承級(jí)別中低于cities的表。 許多我們已經(jīng)討論過的命令,如SELECT, UPDATE, DELETE都支持ONLY的使用。
Note: 盡管繼承經(jīng)常使用,但由于還沒有集成唯一性約束或者外鍵, 因此制約了其實(shí)用性。參閱Section 5.8 以獲取更多細(xì)節(jié)。