Невозможно добавить ограничение внешнего ключа. 1215 HY000 - PullRequest
1 голос
/ 25 апреля 2020

Я получаю эту ошибку для моей таблицы ENROLLS, таблицы TAKES, таблицы CONDUCTED_IN и таблицы EXAM. когда я загружаю свои созданные таблицы в базу данных. Я не уверен, в чем проблема, может кто-нибудь помочь? Таблицы COURSE, SECTION, CLASS_ROOM и STUDENT были добавлены в базу данных очень хорошо, остальные имеют проблемы.

create table COURSE(
CourseNo varchar(10),
Course_Name varchar(30),
Department varchar(25),
primary key(CourseNo)
);

create table SECTION(
CourseNo varchar(10),
SectionNo varchar(2),
primary key(CourseNo, SectionNo),
foreign key(CourseNo) references COURSE(CourseNo)
);

create table ENROLLS(
SSN char(9),
SectionNo varchar(2),
CourseNo varchar(10),
primary key(SSN, CourseNo, SectionNo),
foreign key(SSN) references STUDENT(SSN),
foreign key(SectionNo) references SECTION(SectionNo),
foreign key(CourseNo) references SECTION(CourseNo)
);

create table STUDENT(
SSN char(9),
First_Name varchar(20),
Last_Name varchar(20),
Street varchar(15),
City varchar(15),
Zip char(5),
State varchar(20),
primary key(SSN)
);

create table TAKES(
SSN char(9),
CourseNo varchar(10),
SectionNo varchar(2),
ExamNo char(3),
Result char(1),
primary key(SSN, CourseNo, SectionNo, ExamNo),
foreign key(SSN) references STUDENT(SSN),
foreign key(CourseNo) references EXAM(CourseNo),
foreign key(SectionNo) references EXAM(SectionNo),
foreign key(ExamNo) references EXAM(ExamNo)
);

create table EXAM(
CourseNo varchar(10),
SectionNo varchar(2),
ExamNo char(3),
primary key(CourseNo, SectionNo, ExamNo),
foreign key(CourseNo) references SECTION(CourseNo),
foreign key(SectionNo) references SECTION(SectionNo)
);

create table CONDUCTED_IN(
RoomNo int,
Building varchar(30),
CourseNo varchar(10),
SectionNo varchar(2),
ExamNo char(3),
primary key(RoomNo, Building, CourseNo, SectionNo, ExamNo),
foreign key(RoomNo) references CLASS_ROOM(RoomNo),
foreign key(Building) references CLASS_Room(Building),
foreign key(CourseNo) references EXAM(CourseNo),
foreign key(SectionNo) references EXAM(SectionNo),
foreign key(ExamNo) references EXAM(ExamNo)
);

create table CLASS_ROOM(
RoomNo int,
Building varchar(30),
Capacity int,
primary key(RoomNo, Building)
);

1 Ответ

0 голосов
/ 25 апреля 2020

Проблемы в вашем коде связаны с управлением отношениями

  • таблицы должны создаваться последовательно; если таблица, ссылающаяся на другую таблицу через внешний ключ, должна быть создана после родительской таблицы

  • большая часть вашей таблицы имеет составные первичные ключи (ie первичные ключи, использующие несколько столбцов) - поэтому вам также необходимо составные внешние ключи : вместо создания нескольких внешних ключей для каждого связанного столбца отношения, вам нужен один, несколько -column ключ, который ссылается на кортеж столбцов одновременно

С учетом этих базовых принципов, вот обновленная версия вашего кода, которая отлично работает в этой БД Fiddle .

create table COURSE(
    CourseNo varchar(10),
    Course_Name varchar(30),
    Department varchar(25),
    primary key(CourseNo)
);

create table CLASS_ROOM(
    RoomNo int,
    Building varchar(30),
    Capacity int,
    primary key(RoomNo, Building)
);

create table STUDENT(
    SSN char(9),
    First_Name varchar(20),
    Last_Name varchar(20),
    Street varchar(15),
    City varchar(15),
    Zip char(5),
    State varchar(20),
    primary key(SSN)
);

create table SECTION(
    CourseNo varchar(10),
    SectionNo varchar(2),
    primary key(CourseNo, SectionNo),
    foreign key(CourseNo) references COURSE(CourseNo)
);

create table ENROLLS(
    SSN char(9),
    SectionNo varchar(2),
    CourseNo varchar(10),
    primary key(SSN, CourseNo, SectionNo),
    foreign key(SSN) references STUDENT(SSN),
    foreign key(CourseNo, SectionNo) references SECTION(CourseNo, SectionNo)
);

create table EXAM(
    CourseNo varchar(10),
    SectionNo varchar(2),
    ExamNo char(3),
    primary key(CourseNo, SectionNo, ExamNo),
    foreign key(CourseNo, SectionNo) references SECTION(CourseNo, SectionNo)
);

create table TAKES(
    SSN char(9),
    CourseNo varchar(10),
    SectionNo varchar(2),
    ExamNo char(3),
    Result char(1),
    primary key(SSN, CourseNo, SectionNo, ExamNo),
    foreign key(SSN) references STUDENT(SSN),
    foreign key(CourseNo, SectionNo, ExamNo) references EXAM(CourseNo, SectionNo, ExamNo)
);

create table CONDUCTED_IN(
    RoomNo int,
    Building varchar(30),
    CourseNo varchar(10),
    SectionNo varchar(2),
    ExamNo char(3),
    primary key(RoomNo, Building, CourseNo, SectionNo, ExamNo),
    foreign key(RoomNo, Building) references CLASS_ROOM(RoomNo, Building),
    foreign key(CourseNo, SectionNo, ExamNo) references EXAM(CourseNo, SectionNo, ExamNo)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...