3.3. Внешние ключи#

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. Правильное использование внешних ключей определенно улучшит качество ваших приложений, поэтому настоятельно рекомендуется изучить их.