2015-07-17 5 views
1

Я пытаюсь добавить ограничение внешнего ключа, но не могу понять, что я делаю неправильно. Спасибо заранее за любые предложения.Ошибка добавления внешних ограничений ключа

USE MyTestDB
ALTER TABLE Игрок
ADD CONSTRAINT FK_Player_Team
FOREIGN KEY (TEAM_NAME, Team_Location)
ЛИТЕРАТУРЫ TEAM (TEAM_NAME, Team_Location)

Msg 1776, Level 16, State 0, линия 8 В ссылочной таблице «КОМАНДА» нет первичных или потенциальных ключей, которые соответствуют списку столбцов ссылок в внешнем ключе «FK_Player_Team». Msg 1750, уровень 16, состояние 0, строка 8 Не удалось создать ограничение. См. Предыдущие ошибки.

enter image description here

enter image description here

+0

Я хотел бы предложить, что ключ команда первична проблематичным. Почему у вас нет двух команд в одном месте с таким же именем? Они могут быть в разных подразделениях. Кроме того, копирование команды повсюду проблематично, что происходит, когда меняется название команды? В общем, вам, похоже, не хватает необходимой таблицы для правильной нормализации. Я бы подумал, что вам нужны столы для конференции, деления, стадиона, государства, по крайней мере. В противном случае вы просто продолжаете дублировать информацию. Кроме того, varchar (50) для всего кажется выключенным. Почему бы не указать char (2), например. –

+0

Ваш оператор ALTER TABLE должен работать на основе изображений, которые вы показали, что заставляет меня думать, что они в настоящее время не точны. Обновите представление SSMS таблиц и убедитесь, что они не изменились.Если это не так, посмотрите, можете ли вы писать сценарии из инструкций CREATE TABLE и публиковать их, чтобы мы могли попытаться воспроизвести эту проблему. Я не понимаю, как это может произойти, если ваш вопрос верен. –

+0

Одна вещь, которую вы могли бы попробовать, во-первых, поместить пространство после «КОМАНДА» перед открытой круглой скобкой и предшествовать ей «dbo». просто чтобы понять, имеет ли это значение. Это не должно, но я сторонник хорошо отформатированного SQL. –

ответ

1

Изменен порядок имен столбцов, отлично работает. Не могу поверить, что я этого раньше не видел!

USE MyTestDB
ALTER TABLE dbo.Player
ADD CONSTRAINT FK_Player_Team
FOREIGN KEY (Team_Location, TEAM_NAME)
ЛИТЕРАТУРЫ dbo.TEAM (Team_Location, TEAM_NAME)

1

Сообщение об ошибке на самом деле довольно ясно, описывая то, что проблема есть.

Вы пытаетесь добавить внешний ключ, в котором говорится: «Для каждого имени и местоположения команды в таблице 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. Он должен сделать это, чтобы он мог эффективно выполнять поиск и иметь уникальные гарантии для проверки ограничения.

+0

Я не думаю, что это сообщение об ошибке. –

+0

В таблице Team явно нужен первичный ключ, который также является «Team_Name» и «Team_Location» ... так что он может сделать поиск. – pmbAustin

+0

Ну да, но в соответствии с изображением в вопросе он имеет один. –

Смежные вопросы