他のバージョンの文書 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.3. 外部キー

2章SQL言語weatherテーブルとcitiesテーブルを思い出してください。 次のような問題点を考えてみましょう。 citiesテーブルに一致する項目がない行は絶対にweatherテーブルに挿入できなくしたいとします。 これをデータの参照整合性の保全と呼びます。 最も単純なデータベースシステムでこれを実装するとしたら、まずcitiesテーブルに一致する行が存在するかどうかを確認し、それからweatherテーブルに新規レコードを追加する、あるいは拒絶する、といったことになるでしょう。 この手法には多くの問題があること、そしてとても不便であることから、PostgreSQLに代わって作業させることができます。

これらのテーブルの新しい宣言は以下のようになります。

CREATE TABLE cities (
        city     varchar(80) primary key,
        location point
);

CREATE TABLE weather (
        city      varchar(80) references cities(city),
        temp_lo   int,
        temp_hi   int,
        prcp      real,
        date      date
);

では無効なレコードを挿入してみましょう。

INSERT INTO weather VALUES ('Berkeley', 45, 53, 0.0, '1994-11-28');

ERROR:  insert or update on table "weather" violates foreign key constraint "weather_city_fkey"
DETAIL:  Key (city)=(Berkeley) is not present in table "cities".

外部キーの動作はアプリケーションごとに細かく調整できます。 このチュートリアルではこの簡単な例より先には進みませんが、さらに情報がほしい方は5章データ定義をご覧ください。 外部キーを正しく使用するようにすると、間違いなくデータベースアプリケーションの質を向上させますので身に付くように励んでください。