継承とはオブジェクト指向データベースの概念です。データベース設計において重要でこれまでになかった可能性を広げてくれます。
2つのテーブルを作ってみましょう。cities(都市)
テーブルとcapitals(行政府所在地)
テーブルです。行政府所在地は本来同時に都市でもありますので、全ての都市をリストする時は何もしなくても行政府所在地も表示する何らかの方法が必要です。賢い人なら次のような案を工夫するでしょう。
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;
問い合わせを続ける分には問題はありませんが、たった1つ、いくつか複数の行を更新する時に醜くなります。
より良い解決策は次のような構文です。
CREATE TABLE cities ( name text, population real, altitude int -- (in ft) ); CREATE TABLE capitals ( state char(2) ) INHERITS (cities);
この例では、capitals(行政府所在地)
テーブルの行は親のcities(都市)
テーブルから全ての列、すなわちname(都市名)、population(人口)そしてaltitude(標高)を継承します。
name列のデータ型は、可変長文字列のためにPostgreSQLが初めから備えているtext型です。
州の行政府所在地のテーブルは、これに加えて州を示す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(都市)
テーブルのみを参照することを意味します。既に説明したSELECT、UPDATEおよびDELETEなど数多くのコマンドは、このONLY表記をサポートしています。
注意: 継承は便利ではありますが、UNIQUE制約もしくは外部キーと一緒に使えないので万能ではありません。詳細は項5.8を参照してください。