Рассмотрим следующую проблему. Вы хотите убедиться, что никто не сможет вставить в таблицу строки, для которых нет соответствующей записи в таблице. Это называется поддержанием ссылочной целостности ваших данных. В упрощенных системах баз данных это было бы реализовано (если вообще было бы реализовано) путем сначала просмотра таблицы, чтобы проверить, существует ли совпадающая запись, а затем вставки или отклонения новых записей. Этот подход имеет ряд проблем и очень неудобен, поэтому PostgreSQL может сделать это за вас.citiesweathercitiescitiesweather

Новое объявление таблиц будет выглядеть так:

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

CREATE TABLE weather (
        city      varchar(80) references cities(name),
        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".

Поведение внешних ключей можно точно настроить для вашего приложения. Правильное использование внешних ключей определенно улучшит качество ваших приложений баз данных, поэтому вам настоятельно рекомендуется изучить их.