Пусть R2 – отношение. Тогда внешний ключ FK в отношении R2 – это подмножество множества атрибутов R2 такое, что:
1) существует базовое отношение R1 с потенциальным ключом CK;
2) каждое значение FK в текущем значении R2 всегда совпадает со значением CK некоторого кортежа в текущем значении R1.
Из данного определения можно вывести такие следствия:
1) по определению каждое значение внешнего ключа должно являться значением соответствующего потенциального ключа, но обратное не требуется, т.е. потенциальный ключ может содержать значения, которые в данный момент не являются значением внешнего ключа;
2) данный внешний ключ будет составным тогда и только тогда, когда соответствующий потенциальный ключ тоже составной;
3) каждый атрибут, входящий в данный внешний ключ, должен быть определён на том же домене, что и соответствующий атрибут потенциального ключа;
4) R1 и R2 не обязательно различны.
Рассмотрим отношение Students:
StudentID
Name
GroupID
BirthDate
Казаков Петр
23.04.1990
Васильев Иван
11.05.1991
Шишкина Дарья
23.09.1991
Атрибут GroupID будет являться внешним ключом, т.к. к нему проведена связь от таблицы Groups.
В связи с внешними ключами вводится ещё ряд терминов. Говорят, что значение внешнего ключа представлено ссылкой к кортежу, содержащему соответствующее значение потенциального ключа. Этот кортеж называется ссылочным, или целевым.
Отношение, которое содержит ссылочный ключ, называется ссылающимся отношением, а отношение, которое содержит соответствующий ключ, называется ссылочным, или целевым (target relation).
Существует правило ссылочной целостности: БД не должна содержать несогласованных значений внешних ключей. Несогласованное значение – это такое значение, для которого нет потенциального ключа в ссылочном отношении. Это правило эквивалентно определению внешнего ключа.
Правило целостности связано с состоянием БД в конкретный момент времени. Следовательно, необходим механизм, позволяющий поддерживать БД целостной. Для этого требуется определить операции, которые могут нарушить целостность, и либо запретить их, либо ввести дополнительные компенсирующие операции, которые будут исправлять временное нарушение целостности БД.
Например, нам необходимо удалить группу ПМ-51 из отношения Groups. Если мы просто удалим соответствующий кортеж из таблицы Groups, мы нарушим целостность, т.к. в таблице Students останутся студенты, принадлежащие уже несуществующей группе. Именно для таких случаев разрабатываются компенсирующие операции.
Таким образом, для БД необходимо предусмотреть компенсирующие операции для двух моментов:
1) удаление объекта ссылки внешнего ключа, т.е. ссылочного кортежа;
2) изменение (обновление) потенциального ключа, на который имеется ссылка.
Для компенсации этих операций существуют как минимум две возможности:
1. Ограничить выполнение операции. Для операции удаления – не удалять кортеж, пока не удалят все ссылающиеся кортежи, т.е. отложить удаление;
2. Каскадировать. Здесь возможно несколько вариантов, например при удалении:
· удалить сам кортеж и все соответствующие ссылающиеся кортежи;
· удалить сам кортеж, а для всех ссылающихся кортежей исправить значение на правильное, например, установить NULL-значение для данного атрибута.