Код ошибки: 1822 при совпадении типов данных с составным ключом - PullRequest
0 голосов
/ 29 августа 2018

Получение

Код ошибки: 1822. Не удалось добавить ограничение внешнего ключа. Отсутствует индекс для ограничения 'subject_ibfk_1' в ссылочной таблице 'Регистрация'

при попытке создать таблицу subject. Проблема в том, что ошибка не возникает в предыдущей таблице student. Типы данных одинаковы, а первичные ключи определены.

Эта ошибка возникает для таблиц enrolment и grade.

create table enrolment(
    stud_id char(9) not null,
    subj_code char(8) not null,
    semester tinyint unsigned not null,
    year smallint unsigned not null,
    comment text,

    primary key (stud_id, subj_code, semester, year)
);

create table grade(
    stud_id char(9) not null,
    subj_code char(8) not null,
    semester tinyint unsigned not null,
    year smallint unsigned not null,
    grade tinyint unsigned,

    primary key (stud_id, subj_code, semester, year)
);

create table student(
    stud_id char(9) not null,
    stud_name char(30),
    stud_phone char(12),
    stud_date_of_birth date,
    stud_city char(26),
    stud_address char(30),
    stud_postcode char(4),

    primary key (stud_id),

    foreign key (stud_id)
        references grade(stud_id),
    foreign key (stud_id)
        references enrolment(stud_id)
);

create table subject(
    subj_code char(8) not null,
    subj_title char(40),

    primary key (subj_code),

    foreign key (subj_code)
        references enrolment(subj_code),

    foreign key (subj_code)
        references grade(subj_code)
);

1 Ответ

0 голосов
/ 29 августа 2018

Проблема связана с тем, что внешний ключ subj_code является частью многостолбцового первичного ключа (PK) в ссылочной таблице enrolment:

primary key (stud_id, subj_code, semester, year)

где этот столбец (subj_code) равен , а не самый левый .

Таблица student не имеет этой проблемы, поскольку столбец внешнего ключа stud_id является самым левым столбцом PK в указанной таблице.

Чтобы решить эту проблему, вы можете создать новый индекс для ссылочного столбца:

ALTER TABLE enrolment ADD INDEX subj_code_idx (subj_code);

Примечание: Вы должны сделать то же самое для ссылочной таблицы grade в другом внешнем ключе.

Демо здесь

...