3.3. Внешние ключи#
3.3. Внешние ключи #
Обратимся к таблицам weather и cities из Глава 2. Рассмотрим следующую проблему: нужно убедиться, что никто не может вставить строки в таблицу weather, если нет соответствующей записи в таблице cities. Это называется поддержкой ссылочной целостности данных. В простых базах данных это могло бы быть реализовано (если это вообще возможно) путем первоначальной проверки таблицы cities на наличие соответствующей записи, а затем вставки или отклонения новых записей в таблице weather. Этот подход связан с рядом проблем и является очень неудобным, поэтому Tantor SE-1C предлагает другое решение.
Новое объявление таблиц будет выглядеть следующим образом:
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".
Поведение внешних ключей может быть тонко настроено под ваше приложение. В данном руководстве мы не будем выходить за рамки этого простого примера, а для получения дополнительной информации можно обратиться к Глава 5. Правильное использование внешних ключей определенно улучшит качество ваших приложений, поэтому настоятельно рекомендуется изучить их.