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