第2章の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章をご覧ください。 外部キーを正しく使用するようにすると、間違いなくデータベースアプリケーションの質を向上させますので身に付くように励んでください。