Chapter 5. Postgres SQLの先進的な機能

Table of Contents
5.1. 継承
5.2. 非原子的データ値
5.3. より高度な機能

PostgresSQLを使った データアクセスの基本を説明してきましたが、ここでは従来の データマネージャとは違ったPostgresの 機能について説明します。それらの機能とは、継承、タイムトラベル、 非原子的データ値 (配列属性と組属性) を含みます。 この節の例は、tutorialディレクトリにある advance.sqlでも参照できます。 (使用法は、Chapter 4 を参照してください。)

5.1. 継承

例として、2つのテーブルを作成します。capitals (州都)テーブルは、 cites (市)でもある state capitals (州都)を含んでいます。当然、 capitals テーブルは cities から継承すべきでしょう。

CREATE TABLE cities (
    name            text,
    population      real,
    altitude        int     -- (in ft)
);

CREATE TABLE capitals (
    state           char(2)
) INHERITS (cities);
    
この場合、capitals の列は、全ての列(name (都市名)、population (人 口) altitude(標高))を親である cites テーブルから継承 します。nameのデータ型はtext型で、これは 可変長 ASCII 文字列の為のPostgres固有の データ型です。populationのデータ型はreal で、4バイト 浮動小数点です。State capitals(州都)には、州を表すためにstateとい う列が追加されています。Postgresでは、 テーブルは0以上のテーブルを継承することができ、一回の問い合わせで、 あるテーブルのすべての行、または、あるテーブルのすべての行とその子 孫全てを照することができます。

Note: 継承階層は、有方向非循環グラフです。

以下の問い合わせの例は、州都を含む、標高 500ft 以上に位置する全ての 都市を検索します。

SELECT name, altitude
    FROM cities
    WHERE altitude > 500;
    
結果は下記のようになります。
+----------+----------+
|name      | altitude |
+----------+----------+
|Las Vegas | 2174     |
+----------+----------+
|Mariposa  | 1953     |
+----------+----------+
|Madison   | 845      |
+----------+----------+
    

その一方、標高が 500ft を超える場所に位置する州都以外の都市を検索する 問い合わせは、下記のようになります。

SELECT name, altitude
    FROM ONLY cities
    WHERE altitude > 500;

+----------+----------+
|name      | altitude |
+----------+----------+
|Las Vegas | 2174     |
+----------+----------+
|Mariposa  | 1953     |
+----------+----------+
    

ここでcitiesの前に記述された"ONLY"は、cities の継承階層の下にある テーブルではなく、citiesのテーブルのみを参照することを意味します。 既に説明のあったSELECTUPDATEDELETEなどの多くのコマンドは この"ONLY"表記をサポートしています。

仕様変更に伴い削除されたもの: Postgresの前のバージョンでは、 子テーブルにデフォルトでは接続できないようになっていました。 しかし、これは正しくなく、またSQL99にも反することが わかりました。古いシンタックスでは、サブテーブルを得るためには 下記の例のようにテーブル名に"*"を追加していました。

SELECT * from cities*;
"ONLY"を使って子テーブルをスキャンしないことを明示的 に指定できるのと同様に、今でも"*"を追加することで子テーブルをスキャ ンすることを明示的に指定することができます。参照することは可能で す。しかし、バージョン7.1以前のものではデフォルトでは設定されてい ませんでしたが、バージョン7.1からはデフォルトで、装飾されていない テーブル名は子テーブルも参照するようになっています。以前のデフォ ルトの設定にするには、例えば設定オプション SQL_Inheritanceをoffにして下さい。
SET SQL_Inheritance TO OFF;
あるいは、postgresql.confファイルに行を 追加して下さい。