создать внешний ключ без первичного ключа - PullRequest
11 голосов
/ 26 марта 2011

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

create table D(Did int)
create table E(Eid int foreign key references D(Did))

Приведенный выше запрос выдает ошибку:

There are no primary or candidate keys in the referenced table 'D' that match
the referencing column list in the foreign key 'FK__E__Eid__79C80F94'.

Ответы [ 4 ]

17 голосов
/ 26 марта 2011

Очень хороший вопрос. Нет фундаментальной причины, по которой ссылочное ограничение не должно ссылаться на что-то кроме ключа-кандидата. Существует даже название для таких ограничений: зависимости включения. Внешний ключ - это просто тип зависимости включения, где целью ограничения является ключ-кандидат.

К сожалению, SQL не обеспечивает хорошей поддержки для зависимостей включения или вообще для ссылочных ограничений. SQL ограничивает свои так называемые ограничения FOREIGN KEY ссылками на столбцы ограничения UNIQUE или PRIMARY KEY (хотя это не обязательно ключ-кандидат).

То, с чем вы столкнулись, на самом деле является сомнительным ограничением SQL. Это не значит, что вы делаете что-то очень неправильное.

10 голосов
/ 26 марта 2011

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

Требование также является «уникальным ключом», а не просто первичным ключом, который, конечно, уникален

1 голос
/ 26 марта 2011

Я думаю, что PK он используется внутри, поэтому сервер sql знает, на какой линии работать. Если у вас нет PK и вы поместили одинаковые значения в две разные строки, то у сервера sql возникнут проблемы с обработкой команд.

0 голосов
/ 26 марта 2011

Без внешнего ключа на D записи в E не могут знать, на какую запись ссылаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...