PostgresSQLを使った データアクセスの基本を説明してきましたが、ここでは従来の データマネージャとは違ったPostgresの 機能について説明します。それらの機能とは、継承、タイムトラベル、 非原子的データ値 (配列属性と組属性) を含みます。 この節の例は、tutorialディレクトリにある advance.sqlでも参照できます。 (使用法は、Chapter 4 を参照してください。)
例として、2つのテーブルを作成します。capitals (州都)テーブルは、 cites (市)でもある state capitals (州都)を含んでいます。
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のテーブルのみを参照することを意味します。 既に説明のあったSELECT、UPDATEや DELETEなどの多くのコマンドは この"ONLY"表記をサポートしています。
仕様変更に伴い削除されたもの: Postgresの前のバージョンでは、 子テーブルにデフォルトでは接続できないようになっていました。 しかし、これは正しくなく、またSQL99にも反することが わかりました。古いシンタックスでは、サブテーブルを得るためには 下記の例のようにテーブル名に"*"を追加していました。
SELECT * from cities*;"ONLY"を使って明白に指定しない子テーブルを参照しない のと同様に、今でも"*"を追加して明白に指定された子テーブルを 参照することは可能です。しかし、バージョン7.1以前のものでは デフォルトでは設定されていませんでしたが、バージョン7.1からは デフォルトで、装飾されていないテーブル名は子テーブルも参照する ようになっています。以前のデフォルトの設定にするには、例えば 設定オプションをSQL_Inheritanceをoffに して下さい。SET SQL_Inheritance TO OFF;あるいは、postgresql.confファイルに行を 追加して下さい。