SQL Ошибка, невозможно создать таблицу в определенном формате - PullRequest
0 голосов
/ 20 февраля 2020

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

CREATE TABLE SECTION (
cid     varchar(10)     not null,
sno     varchar(3)      not null,
primary key (cid, sno),
foreign key (cid) references COURSE (cid)
);

CREATE TABLE ROUND_RELEASE (
cid     varchar(10)     not null,
sno     varchar(3)      not null, 
rid     int         not null,
foreign key (cid) references SECTION (cid),
foreign key (sno) references SECTION (sno),
foreign key (rid) references ROUND   (rid)
);

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

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

CREATE TABLE SECTION (
cid     varchar(10)     not null,
sno     varchar(3)      not null,
primary key (**sno, cid**),
foreign key (cid) references COURSE (cid)
);

CREATE TABLE ROUND_RELEASE (
cid     varchar(10)     not null,
sno     varchar(3)      not null, 
rid     int         not null,
foreign key (cid) references SECTION (cid),
foreign key (sno) references SECTION (sno),
foreign key (rid) references ROUND   (rid)
);

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

Любые указания по этому ? Спасибо!

1 Ответ

2 голосов
/ 20 февраля 2020

Исходя из сообщения об ошибке, я предполагаю, что вы используете MySQL.

. Вы видите задокументированное поведение :

In в ссылочной таблице должен быть индекс, в котором указанные столбцы являются столбцами first в том же порядке.

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

create table round_release (
    cid varchar(10) not null,
    sno varchar(3)  not null, 
    rid int not null,
    foreign key (cid, sno) references section(cid, sno),
    foreign key (rid) references round(rid)
);

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

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