Проще говоря, внешний ключ - это набор атрибутов в таблице, которые относятся к первичному ключу другой стол. Внешний ключ связывает эти две таблицы. Другими словами: в контексте реляционных баз данных внешний ключ - это набор атрибутов, на которые распространяется определенный вид ограничений зависимости включения, в частности ограничение, которое кортежи, состоящие из внешних ключей атрибутов в одном отношении, R, также должны существовать в каком-то другом (не обязательно отдельном) отношении, S, и, кроме того, эти атрибуты должны также быть ключом-кандидатом в S. Проще говоря, внешний ключ - это набор атрибутов, который ссылается на ключ-кандидат. Например, таблица с именем TEAM может иметь атрибут MEMBER_NAME, который представляет собой внешний ключ, ссылающийся на ключ-кандидат PERSON_NAME в таблице PERSON. Так как MEMBER_NAME является внешним ключом, любое значение, существующее как имя члена в TEAM, должно также существовать как имя человека в таблице PERSON; другими словами, каждый член КОМАНДЫ также является ЧЕЛОВЕКОМ.
Таблица, содержащая внешний ключ, называется дочерней таблицей, а таблица, содержащая ключ-кандидат, называется ссылочной или родительская таблица. В реляционном моделировании и реализации базы данных ключ-кандидат представляет собой набор из нуля или более атрибутов, значения которых гарантированно уникальны для каждого кортежа (строки) в отношении. Значение или комбинация значений ключевых атрибутов кандидата для любого кортежа не может быть дублирована для любого другого кортежа в этом отношении.
Поскольку цель внешнего ключа состоит в том, чтобы идентифицировать конкретную строку ссылочной таблицы, обычно требуется, чтобы внешний ключ был равен ключу-кандидату в некоторой строке первичной таблицы или не имел значения (значение NULL.). Это правило называется ограничением ссылочной целостности между двумя таблицами. Поскольку нарушения этих ограничений могут быть источником многих проблем с базами данных, большинство систем управления базами данных предоставляют механизмы, гарантирующие, что каждый ненулевой внешний ключ соответствует строке указанной таблицы.
Например, рассмотрим базу данных с двумя таблицами: таблица CUSTOMER, которая включает все данные о клиентах, и таблица ORDER, которая включает все заказы клиентов. Предположим, бизнес требует, чтобы каждый заказ относился к одному покупателю. Чтобы отразить это в базе данных, в таблицу ORDER добавляется столбец внешнего ключа (например, CUSTOMERID), который ссылается на первичный ключ CUSTOMER (например, ID). Поскольку первичный ключ таблицы должен быть уникальным, и поскольку CUSTOMERID содержит только значения из этого поля первичного ключа, мы можем предположить, что, когда он имеет значение, CUSTOMERID будет идентифицировать конкретного клиента, разместившего заказ. Однако этого больше нельзя предполагать, если таблица ORDER не обновляется при удалении строк таблицы CUSTOMER или изменении столбца ID, и работа с этими таблицами может стать более сложной. Многие базы данных реального мира обходят эту проблему путем «деактивации», а не физического удаления внешних ключей главной таблицы, или с помощью сложных программ обновления, которые изменяют все ссылки на внешний ключ, когда требуется изменение.
Внешние ключи играют важную роль в дизайне базы данных. Одна важная часть проектирования базы данных - убедиться, что отношения между реальными сущностями отражаются в базе данных ссылками, используя внешние ключи для ссылки из одной таблицы в другую. Другой важной частью проектирования базы данных является нормализация базы данных, при которой таблицы разбиваются на части, а внешние ключи позволяют их реконструировать.
Несколько строк в ссылающейся (или дочерней) таблице может относиться к той же строке в указанной (или родительской) таблице. В этом случае связь между двумя таблицами называется отношением один ко многим между таблицей, на которую указывает ссылка, и таблицей, на которую указывает ссылка.
Кроме того, дочерняя и родительская таблицы могут фактически быть одной и той же таблицей, т.е. внешний ключ ссылается на одну и ту же таблицу. Такой внешний ключ известен в SQL: 2003 как саморекурсивный или рекурсивный внешний ключ. В системах управления базами данных это часто достигается путем привязки первой и второй ссылки к одной и той же таблице.
Таблица может иметь несколько внешних ключей, и каждый внешний ключ может иметь свою родительскую таблицу. Каждый внешний ключ применяется независимо от системы баз данных . Следовательно, каскадные отношения между таблицами могут быть установлены с использованием внешних ключей.
Внешний ключ определяется как атрибут или набор атрибутов в отношении, значение которых соответствует первичному ключу в другом отношении. ограничение. Синтаксис для добавления такого ограничения к существующей таблице определен в SQL: 2003, как показано ниже. Отсутствие списка столбцов в предложении REFERENCES подразумевает, что внешний ключ должен ссылаться на первичный ключ указанной таблицы. Точно так же внешние ключи могут быть определены как часть SQL-оператора CREATE TABLE
.
CREATE TABLE table_name (id INTEGER PRIMARY KEY, col2 CHARACTER VARYING (20), col3 INTEGER,... FOREIGN KEY (col3) REFERENCES other_table (key_col) ON DELETE CASCADE,...)
Если внешний ключ только один столбец, столбец может быть помечен как таковой, используя следующий синтаксис:
ALTER TABLE