Введение
Концепция в системах баз данных
Внешний ключ – это набор атрибутов в таблице, который ссылается на первичный ключ другой таблицы, устанавливая связь между этими двумя таблицами. В контексте реляционных баз данных внешний ключ подчиняется ограничению зависимости включения, согласно которому кортежи, состоящие из атрибутов внешнего ключа в одном отношении R, должны также существовать в некотором другом (не обязательно отличном) отношении S; при этом эти атрибуты также должны быть кандидатом в первичный ключ в S.
A foreign key is a set of attributes in a table that refers to the primary key of another table, linking these two tables. In the context of relational databases, a foreign key is subject to an inclusion dependency constraint that the tuples consisting of the foreign key attributes in one relation, R, must also exist in some other (not necessarily distinct) relation, S; furthermore that those attributes must also be a candidate key in S.
In other words, a foreign key is a set of attributes that references a candidate key. For example, a table called TEAM may have an attribute, MEMBER NAME, which is a foreign key referencing a candidate key, PERSON NAME, in the PERSON table. Since MEMBER NAME is a foreign key, any value existing as the name of a member in TEAM must also exist as a person's name in the PERSON table; in other words, every member of a TEAM is also a PERSON. Important points to note:
The reference relation should already be created. The referenced attribute must be a part of primary key of the referenced relation. Data type and size of referenced and referencing attribute must be same.
Другими словами, внешний ключ – это набор атрибутов, ссылающихся на кандидатский ключ. Например, таблица TEAM может содержать атрибут MEMBER NAME, который является внешним ключом, ссылающимся на кандидатский ключ PERSON NAME в таблице PERSON. Поскольку MEMBER NAME является внешним ключом, любое значение, существующее как имя участника в TEAM, должно также существовать как имя человека в таблице PERSON; иными словами, каждый участник TEAM также является PERSON. Важно отметить следующее:
A foreign key is a set of attributes in a table that refers to the primary key of another table, linking these two tables. In the context of relational databases, a foreign key is subject to an inclusion dependency constraint that the tuples consisting of the foreign key attributes in one relation, R, must also exist in some other (not necessarily distinct) relation, S; furthermore that those attributes must also be a candidate key in S.
In other words, a foreign key is a set of attributes that references a candidate key. For example, a table called TEAM may have an attribute, MEMBER NAME, which is a foreign key referencing a candidate key, PERSON NAME, in the PERSON table. Since MEMBER NAME is a foreign key, any value existing as the name of a member in TEAM must also exist as a person's name in the PERSON table; in other words, every member of a TEAM is also a PERSON. Important points to note:
The reference relation should already be created. The referenced attribute must be a part of primary key of the referenced relation. Data type and size of referenced and referencing attribute must be same.
Ссылаемое отношение должно быть создано заранее. Атрибут, на который осуществляется ссылка, должен быть частью первичного ключа ссылаемого отношения. Тип данных и размер ссылаемого и ссылающегося атрибутов должны совпадать.
A foreign key is a set of attributes in a table that refers to the primary key of another table, linking these two tables. In the context of relational databases, a foreign key is subject to an inclusion dependency constraint that the tuples consisting of the foreign key attributes in one relation, R, must also exist in some other (not necessarily distinct) relation, S; furthermore that those attributes must also be a candidate key in S.
In other words, a foreign key is a set of attributes that references a candidate key. For example, a table called TEAM may have an attribute, MEMBER NAME, which is a foreign key referencing a candidate key, PERSON NAME, in the PERSON table. Since MEMBER NAME is a foreign key, any value existing as the name of a member in TEAM must also exist as a person's name in the PERSON table; in other words, every member of a TEAM is also a PERSON. Important points to note:
The reference relation should already be created. The referenced attribute must be a part of primary key of the referenced relation. Data type and size of referenced and referencing attribute must be same.
Каскад
При удалении (или обновлении) строк в родительской (ссылаемой) таблице, соответствующие строки в дочерней (ссылающейся) таблице с совпадающим значением столбца внешнего ключа также будут удалены (или обновлены). Это называется каскадным удалением (или обновлением).
Ограничение
Значение нельзя обновить или удалить, если в ссылающей или дочерней таблице существует строка, ссылающаяся на это значение в ссылаемой таблице. Аналогично, строку нельзя удалить, пока на нее есть ссылка из ссылающей или дочерней таблицы. Чтобы лучше понять 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.