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

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

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

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

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

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

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

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

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

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