#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 . . . Во-первых, учащиеся могут существовать без представлений — иначе трудно понять, как создается первое представление. Что более важно, это условие не имеет ничего общего с отношениями внешнего ключа.