3.3. Внешние ключи #
Вспомните таблицы weather
и cities
из Главы 2. Давайте рассмотрим следующую задачу: вы хотите добиться, чтобы никто не мог вставить в таблицу weather
строки, для которых не находится соответствующая строка в таблице cities
. Это называется обеспечением ссылочной целостности данных. В простых СУБД это пришлось бы реализовать (если это вообще возможно) так: сначала явно проверить, есть ли соответствующие записи в таблице cities
, а затем отклонить или вставить новые записи в таблицу weather
. Этот подход очень проблематичен и неудобен, поэтому всё это PostgreSQL может сделать за вас.
Новое объявление таблицы будет выглядеть так:
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');
ОШИБКА: INSERT или UPDATE в таблице "weather" нарушает ограничение внешнего ключа "weather_city_fkey" ПОДРОБНОСТИ: Ключ (city)=(Berkeley) отсутствует в таблице "cities".
Поведение внешних ключей можно подстроить согласно требованиям вашего приложения. Мы не будем усложнять этот простой пример в данном введении, но вы можете обратиться за дополнительной информацией к Главе 5. Правильно применяя внешние ключи, вы определённо создадите более качественные приложения, поэтому мы настоятельно рекомендуем изучить их.