Внешний ключ | это... Что такое Внешний ключ? (original) (raw)
Вне́шний ключ (англ. foreign key) — понятие теории реляционных баз данных, относящееся к ограничениям целостности базы данных.
Неформально выражаясь, внешний ключ представляет собой подмножество атрибутов некоторой переменной отношения _R_2, значения которых должны совпадать со значениями некоторого потенциального ключа некоторой переменной отношения _R_1.
Формальное определение. Пусть _R_1 и _R_2 — две переменные отношения, не обязательно различные. Внешним ключом FK в _R_2 является подмножество атрибутов переменной _R_2 такое, что выполняются следующие требования:
- В переменной отношения _R_1 имеется потенциальный ключ CK такой, что FK и CK совпадают с точностью до переименования атрибутов (то есть переименованием некоторого подмножества атрибутов FK можно получить такое подмножество атрибутов FK’, что FK’ и CK совпадают как по именами, так и по типам атрибутов).
- В любой момент времени каждое значение 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 )
Содержимое этих таблиц следующее:
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
См. также
Базы данных | |
---|---|
Концепции | Модель данных • Реляционная (модель • алгебра • Нормальная форма • Ссылочная целостность • БД • СУБД) • Иерархическая модель • Сетевая (модель • СУБД) • Объектно-ориентированная (БД • СУБД) • Транзакция • Журнализация • Секционирование |
Объекты | Отношение (таблица) • Представление • Хранимая процедура • Триггер • Курсор • Индекс |
Ключи | Потенциальный • Первичный • Внешний • Естественный • Суррогатный (искусственный) • Суперключ |
SQL | SELECT • INSERT • UPDATE • MERGE • DELETE • TRUNCATE • JOIN • UNION • INTERSECT • EXCEPT • CREATE • ALTER • DROP • GRANT • COMMIT • ROLLBACK |
СУБД | IMS • DB2 • Informix • Oracle Database • Microsoft SQL Server • Adaptive Server Enterprise • Teradata Database • Firebird • PostgreSQL • MySQL • SQLite • Microsoft Access • Visual FoxPro • ЛИНТЕР • CouchDB • MongoDB |
Компоненты | Язык запросов • Оптимизатор запросов • План выполнения запроса • ODBC • ADO • ADO.NET • JDBC |