MySQL - невозможно добавить внешний ключ в таблицу - PullRequest
0 голосов
/ 25 сентября 2011

У меня есть база данных, использующая MySQL 2005. У меня есть две таблицы, Enrollment и AlertMsg.

Первичными ключами для регистрации являются два столбца, UnitCode и StudentID.Оба эти столбца являются внешними ключами для другой таблицы.

Первичными ключами для AlertMsg являются три столбца: UnitCode, StudentID и AlertNo.

Когда я пытаюсь создать внешний ключ с UnitCode вТаблица AlertMsg, например, так:

ALTER TABLE AlertMsg
ADD FOREIGN KEY (UnitCode)
REFERENCES Enrolment(UnitCode)

Я получаю следующую ошибку:

SQL Execution Error.

Executed SQL statement: ALTER TABLE AlertMsg

ADD FOREIGN KEY (UnitCode)
REFERENCES Enrolment (UnitCode)
Error Source: .Net SqlClient Data Provider
Error Message: There are no primary or candidate keys in the referenced table 'Enrolment' that match the referencing column list in the foreign key 'FK_AlertMsg_UnitCo_571DF1D5'.
Could not create constraint. See previous errors.

После некоторого поиска кажется, что это потому, что UnitCode не является первичным ключом Enrollment.Но определение таблицы Enrolment, кажется, показывает, что это так.Я немного новичок в SQL, поэтому я предполагаю, что если в крайнем левом столбце определения таблицы есть ключ, это означает, что это первичный ключ таблицы.

Кто-нибудь может помочь?Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 25 сентября 2011

Первичными ключами для регистрации являются два столбца: UnitCode и Студенческий билет. Оба эти столбца являются внешними ключами другой таблицы.

Первичными ключами для AlertMsg являются три столбца, UnitCode, StudentID и AlertNo.

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

Если вы хотите, чтобы это утверждение работало

ALTER TABLE AlertMsg
ADD FOREIGN KEY (UnitCode)
REFERENCES Enrolment(UnitCode)

Значения в UnitCode в таблице Enrolment должны быть уникальными, и вам необходимо добавить уникальное ограничение для этого столбца. Я думаю, что это не так, поэтому вы не можете добавить необходимые уникальные ограничения.

Возможно, вам следует использовать это вместо:

ALTER TABLE AlertMsg
ADD FOREIGN KEY (UnitCode, StudentID)
REFERENCES Enrolment(UnitCode, StudentID)
0 голосов
/ 25 сентября 2011

Вы можете попробовать:

  • Добавить ограничение внешнего ключа к 2 столбцам (UnitCode, StudentID) таблицы регистрации.Или
  • Добавьте уникальное ограничение в столбец (UnitCode) таблицы регистрации, если вам нужна только ссылка на столбец UnitCode.
0 голосов
/ 25 сентября 2011

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

В стандартном SQL внешний ключ должен ссылаться на:

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

Я подозреваю, что вы действительно используете Microsoft SQL Server 2005, а не MySQL. Нет такого выпуска продукта, известного как «MySQL 2005».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...