Вопрос:
Я пытался решить эту ошибку в течение нескольких минут, но я не знаю, чего мне не хватает из определения таблицы.
Ниже приведен код для таблиц:
Таблица Autocare:
CREATE TABLE [dbo].[Autocare] ( [IDAutocar] NUMERIC (18, 0) NOT NULL, [IDTipAutocar] NUMERIC (18, 0) NOT NULL, PRIMARY KEY CLUSTERED ([IDAutocar] ASC, [IDTipAutocar] ASC), CONSTRAINT [FK_Autogari_TipAutocar] FOREIGN KEY ([IDTipAutocar]) REFERENCES [dbo].[TipAutocar] ([IDTipAutocar]) );
Таблица Curse:
CREATE TABLE [dbo].[Curse] ( [IDCursa] NUMERIC (18, 0) NOT NULL PRIMARY KEY, [IDTraseu] NUMERIC (18, 0) NOT NULL, [Data] TIMESTAMP NOT NULL, [IDCompanie] NUMERIC (18, 0) NOT NULL, [NrLocuri] NUMERIC (18, 0) NOT NULL, [IDAutocar] NUMERIC (18, 0) NOT NULL, CONSTRAINT [FK_Curse_Trasee] FOREIGN KEY ([IDTraseu]) REFERENCES [Trasee]([IDTraseu]), CONSTRAINT [FK_Curse_Companii] FOREIGN KEY ([IDCompanie]) REFERENCES [Companii]([IDCompanie]), CONSTRAINT [FK_Curse_Autocare] FOREIGN KEY ([IDAutocar]) REFERENCES [Autocare]([IDAutocar]) )
Когда я пытаюсь выполнить второй script, я получаю следующую ошибку (и я знаю, что-то связано с отношением между таблицами), и я не понимаю, где может быть проблема. Я новичок в С# и SQL Server, поэтому, пожалуйста, простите, если я задал глупый вопрос.
Msg 1776, уровень 16, состояние 0, строка 1
В ссылочной таблице “Autocare” нет первичных или потенциальных ключей, которые соответствуют списку столбцов ссылок во внешнем ключе “FK_Curse_Autocare”.Msg 1750, уровень 16, состояние 0, строка 1
Не удалось создать ограничение. См. Предыдущие ошибки.
Лучший ответ:
В вашей таблице Autocare имеется составной первичный ключ, состоящий из двух столбцов:
PRIMARY KEY CLUSTERED ([IDAutocar] ASC, [IDTipAutocar] ASC),
Поэтому любая таблица, которая хочет ссылаться на Autocare , должна также предоставлять оба столбца в их внешнем ключе!
Таким образом, это будет очевидно не:
CONSTRAINT [FK_Curse_Autocare] FOREIGN KEY ([IDAutocar]) REFERENCES [Autocare]([IDAutocar])
поскольку он ссылается только на один из двух столбцов первичного ключа Autocare.
Вам нужно добавить этот второй столбец IDTipAutocar в таблицу Curse и включить его в свой внешний ключ:
CONSTRAINT [FK_Curse_Autocare] FOREIGN KEY ([IDAutocar], [IDTipAutocar]) REFERENCES [Autocare]([IDAutocar], [IDTipAutocar])
Ваши внешние ключи должны всегда ссылаться на основной (WHOLE) основной ключ, а не только на части.
Ответ №1
Внешний ключ должен ссылаться на уникальный ключ, будь он первичным или нет. В вашем текущем поставляемом DDL уникальный идентификатор (первичный ключ) в Autocare представляет собой комбинацию IDAutocar и IDTipAutocar. С другой стороны, у вас есть Curse ссылка Autocare.IDAutocar, которая не уникальна.
Вы можете добавить IDTipAutocar в Curse (и определение его внешнего ключа):
CREATE TABLE [dbo].[Curse] ( [IDCursa] NUMERIC (18, 0) NOT NULL PRIMARY KEY, [IDTraseu] NUMERIC (18, 0) NOT NULL, [Data] TIMESTAMP NOT NULL, [IDCompanie] NUMERIC (18, 0) NOT NULL, [NrLocuri] NUMERIC (18, 0) NOT NULL, [IDAutocar] NUMERIC (18, 0) NOT NULL, [IDTipAutocar] NUMERIC (18, 0) NOT NULL, CONSTRAINT [FK_Curse_Trasee] FOREIGN KEY ([IDTraseu]) REFERENCES [Trasee]([IDTraseu]), CONSTRAINT [FK_Curse_Companii] FOREIGN KEY ([IDCompanie]) REFERENCES [Companii]([IDCompanie]), CONSTRAINT [FK_Curse_Autocare] FOREIGN KEY ([IDAutocar], [IDTipAutocar]) REFERENCES [Autocare]([IDAutocar], [IDTipAutocar]) )
В качестве альтернативы вы можете удалить IDTipAutocar из Autocare определение первичного ключа:
CREATE TABLE [dbo].[Autocare] ( [IDAutocar] NUMERIC (18, 0) NOT NULL, [IDTipAutocar] NUMERIC (18, 0) NOT NULL, PRIMARY KEY CLUSTERED ([IDAutocar] ASC), CONSTRAINT [FK_Autogari_TipAutocar] FOREIGN KEY ([IDTipAutocar]) REFERENCES [dbo].[TipAutocar] ([IDTipAutocar]) );
Что когда-либо имеет больше смысла с точки зрения вашей бизнес-логики.