Interested Article - Внешний ключ

Вне́шний ключ ( англ. foreign key ) — понятие теории реляционных баз данных , относящееся к ограничениям целостности базы данных .

Неформально выражаясь, внешний ключ представляет собой подмножество атрибутов некоторой переменной отношения R 2 , значения которых должны совпадать со значениями некоторого потенциального ключа некоторой переменной отношения R 1 .

Формальное определение. Пусть R 1 и R 2 — две переменные отношения, не обязательно различные. Внешним ключом FK в R 2 является подмножество атрибутов переменной R 2 такое, что выполняются следующие требования:

  1. В переменной отношения R 1 имеется потенциальный ключ CK такой, что FK и CK совпадают с точностью до переименования атрибутов (то есть переименованием некоторого подмножества атрибутов FK можно получить такое подмножество атрибутов FK’ , что FK’ и CK совпадают как по именам, так и по типам атрибутов).
  2. В любой момент времени каждое значение FK в текущем значении R 2 идентично значению CK в некотором кортеже в текущем значении R 1 . Иными словами, в каждый момент времени множество всех значений FK в R 2 является (нестрогим) подмножеством значений CK в R 1 .

При этом для данного конкретного внешнего ключа FK CK отношение R 1 , содержащее потенциальный ключ, называют главным , целевым , или родительским отношением, а отношение R 2 , содержащее внешний ключ, называют подчинённым , или дочерним отношением.

Поддержка внешних ключей также называется соблюдением ссылочной целостности . Реляционные СУБД поддерживают автоматический контроль ссылочной целостности.

Пример

Предположим, что в базе данных имеется две таблицы: City (города) и Street (улицы), которые определяются следующим образом:

CREATE TABLE City
(
  id   INTEGER NOT NULL PRIMARY KEY,
  name CHAR(40)
)

CREATE TABLE Street
(
  id      INTEGER NOT NULL PRIMARY KEY,
  name    CHAR(40),
  id_city INTEGER NOT NULL FOREIGN KEY REFERENCES City(id)
)

Содержимое этих таблиц следующее:

CITY

ID NAME
1 Москва
2 Санкт-Петербург
3 Владивосток

STREET

ID NAME ID_CITY
181 Малая Бронная 1
182 Тверской бульвар 1
183 Невский проспект 2
184 Пушкинская 2
185 Светланская 3
186 Пушкинская 3

Таблица STREET имеет поле ID_CITY, которое является внешним ключом и ссылается на таблицу CITY. Значение в этом поле соответствует первичному ключу в таблице CITY для того города, где расположена улица. Так, Невский проспект имеет ID_CITY=2, что соответствует Санкт-Петербургу (ID=2 в таблице CITY).

В таблице STREET находятся две улицы с одинаковым названием Пушкинская, которые отличаются значением поля ID_CITY. Одна из них находится в Санкт-Петербурге (ID_CITY=2), другая — во Владивостоке (ID_CITY=3).

Попытка внести в таблицу STREET улицу «Дерибасовская» с ID_CITY=4 вызовет ошибку нарушения ссылочной целостности, поскольку в таблице CITY нет города с ID=4. Однако после внесения в таблицу CITY города «Одесса» с ID=4, повторное внесение улицы «Дерибасовская» с ID_CITY=4 пройдёт успешно.

При удалении из таблицы CITY города Владивостока результат зависит от свойств внешнего ключа:

  • Если для внешнего ключа разрешено удаление по цепочке ( ), то вместе с удалением Владивостока будут удалены улицы Светланская и Пушкинская с ID=3.
  • Если для внешнего ключа запрещено удаление по цепочке, то операция вызовет ошибку нарушения ссылочной целостности, так как в таблице STREET будут находиться улицы с кодом ID_CITY=3, который отсутствует в таблице CITY.

При изменении в таблице CITY кода города Санкт-Петербурга с 2 на 48 результат зависит от свойств внешнего ключа:

  • Если для внешнего ключа разрешено изменение по цепочке ( ), то вместе с изменением кода Санкт-Петербурга будут изменены значения ID_CITY для соответствующих улиц.
  • Если для внешнего ключа запрещено изменение по цепочке, то операция вызовет ошибку нарушения ссылочной целостности, так как в таблице STREET будут находиться улицы с кодом ID_CITY=2, который отсутствует в таблице CITY.

Литература

  • Дейт К. Дж. Введение в системы баз данных = Introduction to Database Systems. — 8-е изд. — М. : , 2006. — 1328 с. — ISBN 0-321-19784-4 .
Источник —

Same as Внешний ключ