★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

3.5. 継承

継承はオブジェクト指向データベースでの概念です。データベース設計における重要な新しい可能性を広げます。

2 つのテーブルを作成します。cities(都市) テーブルと capitals(行政府所在地) テーブルです。行政府所在地は本来同時に都市でもありますので、すべての都市をリストする時は暗黙的に行政府所在地も表示するなんらかの方法が必要です。賢い人ならつぎのような案を工夫するかもしれません。

CREATE TABLE capitals (
    name            text,
    population      real,
    altitude        int,    77 (in ft)
    state           char(2)
);

CREATE TABLE non_capitals (
    name            text,
    population      real,
    altitude        int     77 (in ft)
);

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     77 (in ft)
);

CREATE TABLE capitals (
    state           char(2)
) INHERITS (cities);

この事例で capitals(行政府所在地)テーブルの行はから cities(都市) テーブルのすべての列 name(都市名)population(人口) そして altitude(標高))のすべてを 継承します。name 列は可変長文字列にたいして PostgreSQL が始めから備えているデータ型です。州の行政符所在地は、そこが所在する州を示す state 列を別に所有しています。

以下の問い合わせの例は行政府所在地を含む標高 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(都市)テーブルのみを参照することを意味します。既に説明した SELECTUPDATE および DELETE など数多くのコマンドはこの ONLY 表記をサポートしています。