Не удалось добавить внешний ключ

#mysql #sql #database #database-design

#mysql #sql #База данных #проектирование базы данных

Вопрос:

Я пытаюсь создать две таблицы

 CREATE TABLE Submissions
(
  quiz_ID INT(2) UNSIGNED,
  quiz_duration TIME,
  student_ID INT(2) UNSIGNED,
  attempt_date date,
  PRIMARY KEY (quiz_ID, student_ID)
);
 

и

 CREATE TABLE Students
(
  student_ID INT(2) UNSIGNED,
  student_name VARCHAR(100),
  PRIMARY KEY (student_ID),
  FOREIGN KEY (student_ID) REFERENCES Submissions(student_ID)
);
 

Однако, когда я пытаюсь создать вторую таблицу, она выдает мне сообщение об ошибке

ОШИБКА 1822 (HY000): не удалось добавить ограничение внешнего ключа. Отсутствует индекс для ограничения ‘students_ibfk_1’ в таблице ссылок ‘Представления’

Как мне это исправить?

Ответ №1:

Внешний ключ должен ссылаться на первичный ключ. Вы определили первичный ключ ОТПРАВЛЕНИЙ как составной ключ (quiz_ID, student_ID) . Следовательно, это не соответствует ссылке на внешний ключ STUDENTS, где вы пытаетесь ссылаться на один столбец Submissions(student_ID) . Вот почему вы получаете сообщение об ошибке.

Но давайте углубимся в это. Вы отметили свой вопрос [database-design] , и это был хороший звонок, потому что эта проблема возникает из вашей модели данных.

Студент может (предположительно) участвовать в более чем одном тестировании и, следовательно, иметь более одной заявки. Это указывает на то, что ваша модель данных неверна. Всякий раз, когда у нас есть отношение 1: M, на конец 1 (в данном случае STUDENTS) ссылается внешний ключ на конце M (т. Е. Представления).

Также представляется вероятным, что в вашей модели данных отсутствует таблица для тестов, и ОТПРАВЛЕННЫЕ МАТЕРИАЛЫ фактически должны быть таблицей пересечений.

Учитывая все это, ваши таблицы должны выглядеть следующим образом:

 CREATE TABLE Quizzes
(
  quiz_ID INT(2) UNSIGNED,
  quiz_duration TIME
  PRIMARY KEY (quiz_ID)
);

CREATE TABLE Students
(
  student_ID INT(2) UNSIGNED,
  student_name VARCHAR(100),
  PRIMARY KEY (student_ID)
);

CREATE TABLE Submissions
(
  quiz_ID INT(2) UNSIGNED,
  student_ID INT(2) UNSIGNED,
  attempt_date date,
  PRIMARY KEY (quiz_ID, student_ID),
  FOREIGN KEY (quiz_ID) REFERENCES Quizzes(quiz_ID),
  FOREIGN KEY (student_ID) REFERENCES Students(student_ID)
);
 

Ответ №2:

У вас есть внешние ключи в неправильном порядке. submissions Должно быть ограничение внешнего ключа. Итак:

 CREATE TABLE Submissions (
    quiz_ID INT(2) UNSIGNED,
    quiz_duration TIME,
    student_ID INT(2) UNSIGNED,
    attempt_date date,
    PRIMARY KEY (quiz_ID, student_ID),
    CONSTRAINT fk_subsmissions_student_id FOREIGN KEY (student_id) REFERENCES students(student_id)
);
 

Конечно, Students таблица должна быть создана до того, как будет определен внешний ключ.

Комментарии:

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

2. @user14545805 . . . Во-первых, учащиеся могут существовать без представлений — иначе трудно понять, как создается первое представление. Что более важно, это условие не имеет ничего общего с отношениями внешнего ключа.