Сообщение об ошибке на самом деле довольно ясно, описывая то, что проблема есть.
Вы пытаетесь добавить внешний ключ, в котором говорится: «Для каждого имени и местоположения команды в таблице Player должно быть соответствующее название и местоположение команды в таблице« Команда ».
В сообщении об ошибке явно указано, что он не может добавить ограничение, потому что это не так: в таблице Player есть имя команды и местоположение, которое НЕ существует в таблице Team.
Запрос, подобный этому, должен содержать список строк, которые являются проблемой ... и вам нужно добавить строки с этими именами и местоположениями команд в таблицу Team (или удалить эти строки из таблицы Player) перед тем, как вы может успешно добавить ограничение:
SELECT *
FROM dbo.Player p
WHERE NOT EXISTS (SELECT *
FROM dbo.Team t
WHERE t.Team_Name = p.Team_Name AND t.Team_Location = p.Team_Location)
Кроме того, ссылка на внешний ключ должна ссылаться на индекс первичного ключа. Поскольку первичный ключ в этом случае относится к имени и фамилии, а не к имени и местоположению команды, он не может применять ограничение FK. Он должен сделать это, чтобы он мог эффективно выполнять поиск и иметь уникальные гарантии для проверки ограничения.
Я хотел бы предложить, что ключ команда первична проблематичным. Почему у вас нет двух команд в одном месте с таким же именем? Они могут быть в разных подразделениях. Кроме того, копирование команды повсюду проблематично, что происходит, когда меняется название команды? В общем, вам, похоже, не хватает необходимой таблицы для правильной нормализации. Я бы подумал, что вам нужны столы для конференции, деления, стадиона, государства, по крайней мере. В противном случае вы просто продолжаете дублировать информацию. Кроме того, varchar (50) для всего кажется выключенным. Почему бы не указать char (2), например. –
Ваш оператор ALTER TABLE должен работать на основе изображений, которые вы показали, что заставляет меня думать, что они в настоящее время не точны. Обновите представление SSMS таблиц и убедитесь, что они не изменились.Если это не так, посмотрите, можете ли вы писать сценарии из инструкций CREATE TABLE и публиковать их, чтобы мы могли попытаться воспроизвести эту проблему. Я не понимаю, как это может произойти, если ваш вопрос верен. –
Одна вещь, которую вы могли бы попробовать, во-первых, поместить пространство после «КОМАНДА» перед открытой круглой скобкой и предшествовать ей «dbo». просто чтобы понять, имеет ли это значение. Это не должно, но я сторонник хорошо отформатированного SQL. –