Внешний ключ | это... Что такое Внешний ключ? (original) (raw)

Вне́шний ключ (англ. 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.

При этом для данного конкретного внешнего ключа FKCK отношение _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 )

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

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 города Владивостока результат зависит от свойств внешнего ключа:

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

Литература

См. также

Есть более полная статья
Просмотр этого шаблона Базы данных
Концепции Модель данных • Реляционная (модельалгебраНормальная формаСсылочная целостностьБДСУБД) • Иерархическая модель • Сетевая (модельСУБД) • Объектно-ориентированная (БДСУБД) • ТранзакцияЖурнализацияСекционирование
Объекты Отношение (таблица)ПредставлениеХранимая процедураТриггерКурсорИндекс
Ключи ПотенциальныйПервичныйВнешнийЕстественныйСуррогатный (искусственный) • Суперключ
SQL SELECTINSERTUPDATEMERGEDELETETRUNCATEJOINUNIONINTERSECT • EXCEPT • CREATE • ALTER • DROP • GRANT • COMMITROLLBACK
СУБД IMSDB2InformixOracle DatabaseMicrosoft SQL ServerAdaptive Server EnterpriseTeradata DatabaseFirebirdPostgreSQLMySQLSQLiteMicrosoft AccessVisual FoxProЛИНТЕРCouchDBMongoDB
Компоненты Язык запросовОптимизатор запросовПлан выполнения запросаODBCADOADO.NETJDBC