Создание нового внешнего ключа (SQL Server)

У меня проблемы с созданием внешнего ключа в моей БД. Вот перефразированная модель того, как выглядят мои таблицы:

ПРИМЕЧАНИЕ

 * (PK) NOTE_ID   BIGINT
 *      TITLE     VARCHAR(200)
 *      DATE      DATETIME
 *      SERIES_ID BIGINT

СЕРИЯ

 * (PK) SERIES_ID BIGINT
 *      TITLE     VARCHAR(200)
 *      DESCR     VARCHAR(1000)

Я пытаюсь создать связь "имеет" между NOTE и SERIES на SERIES_ID. Я думал, что установка внешнего ключа между двумя таблицами с помощью SERIES_ID будет решением, но когда я пытаюсь создать его, я получаю следующую ошибку:

ОШИБКА: в указанной таблице dbo.SERIES нет первичных ключей или ключей-кандидатов, которые соответствуют списку ссылающихся столбцов во внешнем ключе FK_ SERIES _NOTE. Не удалось создать ограничение

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

В конце концов, это все, что нужно для создания отношения, чтобы сопоставления NHibernate для моего объекта Note содержали однозначное отношение к объекту Series. Однако я, возможно, даже не пытаюсь решить эту проблему с помощью внешнего ключа.

Правильно ли я поступаю?

РЕДАКТИРОВАТЬ: Пытаясь объединить таблицы в более простой пример, я удалил то, что я считал несколькими некритическими столбцами. Однако в итоге я оставил поле, которое на самом деле было частью составного первичного ключа в таблице серий. Итак, поскольку я пытался назначить внешний ключ только одной части составного ключа, это не позволяло мне это сделать.

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


person Tyler Murry    schedule 05.04.2012    source источник
comment
Без создания фактического оператора T-SQL действительно сложно что-либо сказать ... скорее всего, этот веб-менеджер делает что-то не так - или вы выбираете не те столбцы или что-то в этом роде ... .   -  person marc_s    schedule 05.04.2012
comment
@Tyler, с точки зрения NHibernate и с точки зрения базы данных, это не однозначное отношение. Это отношения "многие к одному". Если бы оба первичных ключа были NOTE_ID, это было бы отношение «один к одному».   -  person Cole W    schedule 05.04.2012
comment
Вы отметили SERIES_ID как первичный ключ в SERIES, но проверили ли вы, что это действительно так? Многие люди путают первичные ключи и столбцы идентификаторов - это две разные концепции. Если возможно, позволяет ли используемое вами приложение-менеджер создавать сценарии для существующих объектов? Если это так, было бы полезно добавить фактические определения таблиц, а не ваши псевдоопределения.   -  person Damien_The_Unbeliever    schedule 05.04.2012
comment
Полностью согласен с тем, что сказал @Damien_The_Unbeliever. На самом деле это не обязательно должен быть ПК, но, по крайней мере, он должен иметь уникальный индекс.   -  person HLGEM    schedule 05.04.2012


Ответы (1)


Если вы можете, вы можете попробовать запустить следующий оператор в анализаторе запросов и увидеть полученное сообщение об ошибке (я полагаю, что @Damien_The_Unbeliever прав):

ALTER TABLE NOTE ADD CONSTRAINT FK_SERIES_NOTE 
FOREIGN KEY (SERIES_ID) REFERENCES SERIES(SERIES_ID)
--ON DELETE CASCADE
-- uncomment the preceding line if you want a delete on a serie 
-- to automatically delete all notes on this serie

Надеюсь, это поможет

person jbl    schedule 05.04.2012