Введение

Концепция в системах баз данных
Внешний ключ – это набор атрибутов в таблице, который ссылается на первичный ключ другой таблицы, устанавливая связь между этими двумя таблицами. В контексте реляционных баз данных внешний ключ подчиняется ограничению зависимости включения, согласно которому кортежи, состоящие из атрибутов внешнего ключа в одном отношении R, должны также существовать в некотором другом (не обязательно отличном) отношении S; при этом эти атрибуты также должны быть кандидатом в первичный ключ в S.

Другими словами, внешний ключ – это набор атрибутов, ссылающихся на кандидатский ключ. Например, таблица TEAM может содержать атрибут MEMBER NAME, который является внешним ключом, ссылающимся на кандидатский ключ PERSON NAME в таблице PERSON. Поскольку MEMBER NAME является внешним ключом, любое значение, существующее как имя участника в TEAM, должно также существовать как имя человека в таблице PERSON; иными словами, каждый участник TEAM также является PERSON. Важно отметить следующее:

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

Каскад

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

Ограничение

Значение нельзя обновить или удалить, если в ссылающей или дочерней таблице существует строка, ссылающаяся на это значение в ссылаемой таблице. Аналогично, строку нельзя удалить, пока на нее есть ссылка из ссылающей или дочерней таблицы. Чтобы лучше понять RESTRICT (и CASCADE), полезно обратить внимание на следующее различие, которое может быть не сразу очевидным. Референциальное действие CASCADE изменяет "поведение" самой (дочерней) таблицы, где используется слово CASCADE. Например, ON DELETE CASCADE фактически означает: "Когда ссылаемая строка удаляется из другой таблицы (главной таблицы), удалите и из меня". Однако, референциальное действие RESTRICT изменяет "поведение" главной таблицы, а не дочерней, хотя слово RESTRICT появляется в дочерней таблице, а не в главной! Таким образом, ON DELETE RESTRICT фактически говорит: "Когда кто-то пытается удалить строку из другой таблицы (главной таблицы), запретите удаление из этой другой таблицы (и, конечно, не удаляйте и из меня, но это не главный момент здесь)". RESTRICT не поддерживается в Microsoft SQL 2012 и более ранних версиях.

Никаких действий

NO ACTION и RESTRICT очень похожи. Основное различие между NO ACTION и RESTRICT заключается в том, что при NO ACTION проверка ссылочной целостности выполняется после попытки изменения таблицы, а RESTRICT выполняет проверку до попытки выполнения оператора UPDATE или DELETE. Оба действия по ссылочной целостности ведут себя одинаково в случае сбоя проверки: оператор UPDATE или DELETE завершится с ошибкой. Иными словами, при выполнении оператора UPDATE или DELETE в ссылаемой таблице с использованием действия NO ACTION, СУБД проверяет в конце выполнения оператора, что ни одно из ссылочных отношений не было нарушено. Это отличается от RESTRICT, который изначально предполагает, что операция нарушит ограничение. При использовании NO ACTION триггеры или семантика самого оператора могут привести к конечному состоянию, в котором к моменту окончательной проверки ограничения нарушения связей внешнего ключа не будет, что позволит оператору успешно завершиться.

SET NULL, SET DEFALT (Стандартный код)

В общем случае, действие, выполняемое СУБД при использовании SET NULL или SET DEFAULT, одинаково как для ON DELETE, так и для ON UPDATE: значение соответствующих ссылочных атрибутов изменяется на NULL для SET NULL и на указанное значение по умолчанию для SET DEFAULT.