в каждой книге написано, что внешние ключи на самом деле являются первичным ключом в какой-либо другой таблице, но мы можем иметь внешний ключ, который не является первичным ключом в любой другой таблице.
Можем ли мы иметь внешний ключ, который не является первичным ключом в любой другой таблице?
Ответ 1
Да - вы можете иметь внешний ключ, который ссылается на уникальный индекс в другой таблице.
CREATE UNIQUE INDEX UX01_YourTable ON dbo.YourTable(SomeUniqueColumn)
ALTER TABLE dbo.YourChildTable
ADD CONSTRAINT FK_ChildTable_Table
FOREIGN KEY(YourFKColumn) REFERENCES dbo.YourTable(SomeUniqueColumn)
Ответ 2
По определению внешний ключ должен ссылаться на ключ-кандидат некоторой таблицы. Он не обязательно должен быть основным ключом.
В деталях ограничение, называемое FOREIGN KEY в SQL, не совсем эквивалентно определению внешнего ключа в реляционной модели. Ограничение SQL FOREIGN KEY отличается тем, что:
- он может ссылаться на любой набор столбцов, подверженных ограничению уникальности, даже если они не являются ключами-кандидатами (например, суперклассы или столбцы с возможностью сбрасывания).
- он может содержать нули, и в этом случае ограничение не выполняется
- его синтаксис зависит от порядка столбцов, поэтому ограничение fk на (A, B), ссылающееся на (A, B), отличается от ограничения на (B, A), ссылающегося на (A, B).
Ответ 3
Да, может быть внешний ключ, который является уникальным ключом в другой таблице, поскольку уникальный ключ является подмножеством первичного ключа, но не точного первичного ключа.
Таким образом, возможно, что внешний ключ является уникальным ключом в другой таблице.
Ответ 4
Общий стандартный ответ - нет. Это возможно только в том случае, если внешний ключ однозначно ссылается на любой столбец в другой таблице. Это означает, что внешний ключ должен быть ключом-кандидатом в другой таблице, а первичный ключ также является ключом-кандидатом таблицы.