Создавать внешний ключ без первичного ключа

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

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'.

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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