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

Я создавал базу данных, создавая 3 таблицы (classes, lectures, taking), а затем изменяя таблицу, чтобы добавить foreign key.

Однако я продолжаю получать следующую ошибку: ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint

Я не вижу никаких проблем с кодами, так в чем может быть проблема?? (Я использовал mySQL Workbench. Я пытался копировать и вставлять в виде txt-файла, потому что я думал, что это может быть проблема с сопоставлением, но все же возникала та же проблема)

Код выглядит следующим образом:

CREATE TABLE classes (
    course_id VARCHAR(8),
    classes_id VARCHAR(10),
    semester VARCHAR(10),
    year VARCHAR(10),
    PRIMARY KEY (course_id, classes_id, semester, year)
);

CREATE TABLE taking (
    student_id VARCHAR(8),
    course_id VARCHAR(10),
    classes_id VARCHAR(10),
    semester VARCHAR(10),
    year VARCHAR(10),
    grade char(1),
    PRIMARY KEY (student_id, course_id, semester, year)
);

CREATE TABLE lectures (
    professor_id VARCHAR(8),
    course_id VARCHAR(10),
    classes_id VARCHAR(10),
    semester VARCHAR(10),
    year VARCHAR(10),
    PRIMARY KEY (professor_id, course_id, semester, year)
);

ALTER TABLE taking ADD CONSTRAINT consTAKE3 FOREIGN KEY(classes_id) REFERENCES classes(classes_id) ON DELETE CASCADE;
ALTER TABLE taking ADD CONSTRAINT consTAKE4 FOREIGN KEY(semester) REFERENCES classes(semester) ON DELETE CASCADE;
ALTER TABLE taking ADD CONSTRAINT consTAKE5 FOREIGN KEY(year) REFERENCES classes(year) ON DELETE CASCADE;

ALTER TABLE lectures ADD CONSTRAINT consLEC3 FOREIGN KEY(classes_id) REFERENCES classes(classes_id) ON DELETE CASCADE;
ALTER TABLE lectures ADD CONSTRAINT consLEC4 FOREIGN KEY(semester) REFERENCES classes(semester) ON DELETE CASCADE;
ALTER TABLE lectures ADD CONSTRAINT consLEC5 FOREIGN KEY(year) REFERENCES classes(year) ON DELETE CASCADE;

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

ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'consTAKE3' in the referenced table 'classes'
ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'consTAKE4' in the referenced table 'classes'
ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'consTAKE5' in the referenced table 'classes'
ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'consLEC3' in the referenced table 'classes'
ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'consLEC4' in the referenced table 'classes'
ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'consLEC5' in the referenced table 'classes'

Прямо сейчас я пытаюсь выполнить это из cmd, используя ysql –u root –p. Тем не менее, возникает та же проблема.


person Learner_15    schedule 07.11.2020    source источник


Ответы (2)


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

Если у вас нет уникального ограничения/индекса для составных столбцов первичного ключа в каждой таблице.

Чтобы создать связь в таблицах, попробуйте это для dbo.taking, используйте аналогичный подход и для других таблиц.

ALTER TABLE dbo.taking 
  ADD CONSTRAINT FK_taking_classes
  FOREIGN KEY(course_id, classes_id, semester, year) REFERENCES classes(course_id, 
classes_id, semester, year)
person lareb    schedule 07.11.2020
comment
Длина символа course_id в обеих таблицах различается, что приводит к тому, что FK не создается. Пожалуйста, установите его в varchar(8) в таблице taking так же, как и в classes. Это обязательно решит проблему. Я создал таблицы, а также имею FK, используя предоставленный запрос. - person lareb; 07.11.2020

Длина символа course_id в обеих таблицах различается, что приводит к тому, что FK не создается. Пожалуйста, установите его на varchar(8) в таблице taking так же, как и в classes. Это обязательно решит проблему. Я создал таблицы, а также имею FK, используя предоставленный запрос.

Затем выполните вышеупомянутый запрос:

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

Если у вас нет уникального ограничения/индекса для составных столбцов первичного ключа в каждой таблице.

Чтобы создать связь в таблицах, попробуйте это для dbo.taking, используйте аналогичный подход и для других таблиц.

  ALTER TABLE dbo.taking 
  ADD CONSTRAINT FK_taking_classes
  FOREIGN KEY(course_id, classes_id, semester, year) REFERENCES classes(course_id, 
  classes_id, semester, year)
person lareb    schedule 07.11.2020
comment
Нет, это неправильно. Разница в длине в varchars допускается в случае внешних ключей. Сообщение об ошибке также было довольно явным в отношении отсутствующего индекса. - person Shadow; 07.11.2020