Внешний ключ

Поделись знанием:
Перейти к: навигация, поиск

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

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

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

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

При этом для данного конкретного внешнего ключа FKCK отношение R1, содержащее потенциальный ключ, называют главным, целевым, или родительским отношением, а отношение R2, содержащее внешний ключ, называют подчинённым, или дочерним отношением.

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



Пример

Предположим, что в базе данных имеется две таблицы: 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.

Напишите отзыв о статье "Внешний ключ"

Литература

См. также


Отрывок, характеризующий Внешний ключ

– Хорошо! хорошо! мы обо всем переговорим, – сказал князь Андрей, – только дайте доложить про этого господина, и я принадлежу вам.
В то время как князь Андрей ходил докладывать про багрового генерала, генерал этот, видимо, не разделявший понятий Бориса о выгодах неписанной субординации, так уперся глазами в дерзкого прапорщика, помешавшего ему договорить с адъютантом, что Борису стало неловко. Он отвернулся и с нетерпением ожидал, когда возвратится князь Андрей из кабинета главнокомандующего.
– Вот что, мой милый, я думал о вас, – сказал князь Андрей, когда они прошли в большую залу с клавикордами. – К главнокомандующему вам ходить нечего, – говорил князь Андрей, – он наговорит вам кучу любезностей, скажет, чтобы приходили к нему обедать («это было бы еще не так плохо для службы по той субординации», подумал Борис), но из этого дальше ничего не выйдет; нас, адъютантов и ординарцев, скоро будет батальон. Но вот что мы сделаем: у меня есть хороший приятель, генерал адъютант и прекрасный человек, князь Долгоруков; и хотя вы этого можете не знать, но дело в том, что теперь Кутузов с его штабом и мы все ровно ничего не значим: всё теперь сосредоточивается у государя; так вот мы пойдемте ка к Долгорукову, мне и надо сходить к нему, я уж ему говорил про вас; так мы и посмотрим; не найдет ли он возможным пристроить вас при себе, или где нибудь там, поближе .к солнцу.
Князь Андрей всегда особенно оживлялся, когда ему приходилось руководить молодого человека и помогать ему в светском успехе. Под предлогом этой помощи другому, которую он по гордости никогда не принял бы для себя, он находился вблизи той среды, которая давала успех и которая притягивала его к себе. Он весьма охотно взялся за Бориса и пошел с ним к князю Долгорукову.
Было уже поздно вечером, когда они взошли в Ольмюцкий дворец, занимаемый императорами и их приближенными.
В этот самый день был военный совет, на котором участвовали все члены гофкригсрата и оба императора. На совете, в противность мнения стариков – Кутузова и князя Шварцернберга, было решено немедленно наступать и дать генеральное сражение Бонапарту. Военный совет только что кончился, когда князь Андрей, сопутствуемый Борисом, пришел во дворец отыскивать князя Долгорукова. Еще все лица главной квартиры находились под обаянием сегодняшнего, победоносного для партии молодых, военного совета. Голоса медлителей, советовавших ожидать еще чего то не наступая, так единодушно были заглушены и доводы их опровергнуты несомненными доказательствами выгод наступления, что то, о чем толковалось в совете, будущее сражение и, без сомнения, победа, казались уже не будущим, а прошедшим. Все выгоды были на нашей стороне. Огромные силы, без сомнения, превосходившие силы Наполеона, были стянуты в одно место; войска были одушевлены присутствием императоров и рвались в дело; стратегический пункт, на котором приходилось действовать, был до малейших подробностей известен австрийскому генералу Вейротеру, руководившему войска (как бы счастливая случайность сделала то, что австрийские войска в прошлом году были на маневрах именно на тех полях, на которых теперь предстояло сразиться с французом); до малейших подробностей была известна и передана на картах предлежащая местность, и Бонапарте, видимо, ослабленный, ничего не предпринимал.
Долгоруков, один из самых горячих сторонников наступления, только что вернулся из совета, усталый, измученный, но оживленный и гордый одержанной победой. Князь Андрей представил покровительствуемого им офицера, но князь Долгоруков, учтиво и крепко пожав ему руку, ничего не сказал Борису и, очевидно не в силах удержаться от высказывания тех мыслей, которые сильнее всего занимали его в эту минуту, по французски обратился к князю Андрею.
– Ну, мой милый, какое мы выдержали сражение! Дай Бог только, чтобы то, которое будет следствием его, было бы столь же победоносно. Однако, мой милый, – говорил он отрывочно и оживленно, – я должен признать свою вину перед австрийцами и в особенности перед Вейротером. Что за точность, что за подробность, что за знание местности, что за предвидение всех возможностей, всех условий, всех малейших подробностей! Нет, мой милый, выгодней тех условий, в которых мы находимся, нельзя ничего нарочно выдумать. Соединение австрийской отчетливости с русской храбростию – чего ж вы хотите еще?