Ограничения FOREIGN KEY

Внешний ключ (FK) — это столбец или сочетание столбцов, которое применяется для принудительного установления связи между данными в двух таблицах. Внешний ключ можно создать, определив ограничение FOREIGN KEY при создании или изменении таблицы.

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

Например, в таблице Sales.SalesOrderHeader в базе данных База данных AdventureWorks2008R2 есть связь с таблицей Sales.SalesPerson, так как существует логическая связь между заказами на продажу и менеджерами по продажам. Столбец SalesPersonID в таблице Sales.SalesOrderHeader соответствует столбцу первичного ключа в таблице SalesPerson. Столбец SalesPersonID в таблице Sales.SalesOrderHeader является внешним ключом для таблицы SalesPerson.

Столбец SalesOrderHeader.SalesPersonID является внешним ключом.

Ограничение FOREIGN KEY не обязательно должно быть связано с ограничением PRIMARY KEY в другой таблице. Кроме того, с помощью этого ограничения могут указываться столбцы ограничения UNIQUE в другой таблице. Ограничение FOREIGN KEY может содержать значения NULL. Впрочем, если любой из столбцов сложного ограничения FOREIGN KEY содержит значения NULL, то при проверке будут пропущены все значения, составляющие ограничение FOREIGN KEY. Чтобы проверялись все значения сложного ограничения FOREIGN KEY, укажите для всех участвующих столбцов параметр NOT NULL.

ПримечаниеПримечание

Ограничение FOREIGN KEY может ссылаться на столбцы в таблицах этой же базы данных или столбцы этой же самой таблицы. Такие таблицы называются ссылающимися на себя. Возьмем, к примеру, таблицу работников, состоящую из трех столбцов: employee_number, employee_name и manager_employee_number. Поскольку менеджер также является работником, существует связь внешнего ключа в столбце manager_employee_number со столбцом employee_number.

Ссылочная целостность

Хотя главная задача ограничения FOREIGN KEY — управление данными, которые могут быть сохранены в таблице внешнего ключа, это ограничение также контролирует изменение данных в таблице первичного ключа. Например, при удалении строки для менеджера по продажам из таблицы Sales.SalesPerson, идентификатор которого используется в заказах на продажу в таблице Sales.SalesOrderHeader, ссылочная целостность двух таблиц будет нарушена. Заказы на продажу удаленного менеджера в таблице SalesOrderHeader станут недействительными без связи с данными в таблице SalesPerson.

Ограничение FOREIGN KEY предотвращает возникновение этой ситуации. Ограничение обеспечивает целостность ссылок следующим образом: оно запрещает изменение данных в таблице первичного ключа, если такие изменения сделают недопустимой ссылку в таблице внешнего ключа. Если при попытке удалить строку в таблице первичного ключа или изменить значение этого ключа окажется, что удаленному или измененному значению первичного ключа соответствует значение в ограничении FOREIGN KEY в другой таблице, то действие выполнено не будет. Для успешного изменения или удаления строки с ограничением FOREIGN KEY необходимо сначала удалить данные внешнего ключа в соответствующей таблице либо изменить данные в таблице внешнего ключа, которые связывают внешний ключ с данными другого первичного ключа.

Индексирование ограничений FOREIGN KEY

Необходимость создать индекс внешних ключей часто возникает по следующим причинам:

  • С помощью ограничений FOREIGN KEY в связанных таблицах проверяются изменения ограничений PRIMARY KEY.

  • Столбцы внешних ключей часто используются для объединения критериев при соединении данных из связанных таблиц в запросах. Это делается путем сопоставления столбца или столбцов в ограничении FOREIGN KEY в одной таблице с одним или несколькими столбцами первичного или уникального ключей в другой таблице. Индекс позволяет компоненту Database Engine быстро находить связанные данные в таблице внешних ключей. Впрочем, создание индекса не является обязательным. Данные из двух связанных таблиц можно объединять, даже если в таблицах нет соответствующих ограничений PRIMARY KEY или FOREIGN KEY, однако связь внешних ключей между двумя таблицами означает, что эти две таблицы оптимизированы для соединения в запросе, где ключи используются в качестве критериев. Дополнительные сведения о применении ограничений FOREIGN KEY при соединении см. в разделах Основные принципы соединения и Типы запросов и индексы.

Количество ограничений FOREIGN KEY в таблице

В SQL Server не предусмотрено ни максимальное количество ограничений FOREIGN KEY в одной таблице (со ссылками на другие таблицы), ни максимальное число ограничений FOREIGN KEY из других таблиц, ссылающихся на одну таблицу. Тем не менее фактическое максимальное число ограничений FOREIGN KEY ограничено конфигурацией оборудования и структуры базы данных и приложения. Рекомендуется, чтобы таблица содержала не более 253 ограничений FOREIGN KEY, а также чтобы на нее ссылалось не более 253 ограничений FOREIGN KEY. При разработке базы данных и приложений следует учитывать стоимость принудительных ограничений FOREIGN KEY.