0

Я создаю приложение, которое будет обрабатывать и записывать, когда студент получает информацию от преподавателя в университете, и мне нужен эффективный способ структурирования таблиц. Моя проблема связана с отсутствием ссылочной целостности, вызванной неспособностью создать внешний ключ, который будет ссылаться на СТУДЕНТ только на составную часть ADVISE_HIST, которая является (STUDENT_ID, DATE_ADVISED)ссылка на внешний ключ mysql из составного ключа

вот некоторые из столы

create table STUDENT(
    LNAME varchar(50), 
    FNAME varchar(50), 
    ID char(9) primary key, 
    ASSIGNED_ADVISOR_EMAIL varchar(70), 
    foreign key (ASSIGNED_ADVISOR_EMAIL) references DEP_FACULTY(EMAIL) ON DELETE SET NULL, 
    IS_ADVISED tinyint(1), 
); 

create table DEP_FACULTY(
    LNAME varchar(50), 
    FNAME varchar(50), 
    EMAIL varchar(70) primary key 
); 

create table ADVISE_HIST(
    STUDENT_ID char(9), 
    /*foreign key (STUDENT_ID) references STUDENT(ID),*/ 
    ACTUAL_ADVISOR_EMAIL char(70) NOT NULL, 
    foreign key (ACTUAL_ADVISOR_EMAIL) references DEP_FACULTY(EMAIL), 
    DATE_ADVISED date, 
    primary key REF_ADVISE_HIST (STUDENT_ID, DATE_ADVISED), 
); 

Мой вопрос, есть ли способ обойти не в состоянии создать этот ключ или есть лучше структура, я не думал?

+0

Вы не можете ссылаться на столбец 'ID' в таблице' STUDENT', потому что его не существует! Вы имели в виду ссылку «ENUMBER»? – eggyal

+0

извините, я исправил это. это идентификатор. –

+0

Если вы пытаетесь добавить ограничение внешнего ключа ('ALTER TABLE ADVISE_HIST ADD CONSTRAINT FOREIGN KEY (STUDENT_ID) ССЫЛКИ СТУДЕНТА (ID);'), какая ошибка вы получаете? – eggyal

ответ

0

У MySQL много restrictions on foreign keys. Среди тех, которые могут быть на вашем пути. , ,

  • Обе таблицы должны использовать двигатель INNODB.
  • «В ссылающейся таблице, должен быть индекс, где столбцы внешнего ключа, перечислены в качестве первых столбцов в том же порядке.»

Этот код работает в моей версии (5.1.62).

create table DEP_FACULTY(
    LNAME varchar(50), 
    FNAME varchar(50), 
    EMAIL varchar(70) primary key 
) ENGINE = INNODB; 

insert into DEP_FACULTY values ('Gregor', 'Brandich', '[email protected]'); 

create table STUDENT(
    LNAME varchar(50), 
    FNAME varchar(50), 
    ID char(9) primary key, 
    ASSIGNED_ADVISOR_EMAIL varchar(70), 
    foreign key (ASSIGNED_ADVISOR_EMAIL) references DEP_FACULTY(EMAIL) ON DELETE SET NULL, 
    IS_ADVISED tinyint(1) 
) ENGINE = INNODB; 

insert into STUDENT values ('Charmaine', 'DePeletier', 'cmd', '[email protected]', 1); 

create table ADVISE_HIST(
    STUDENT_ID char(9), 
    foreign key (STUDENT_ID) references STUDENT(ID), 
    ACTUAL_ADVISOR_EMAIL char(70) NOT NULL, 
    foreign key (ACTUAL_ADVISOR_EMAIL) references DEP_FACULTY(EMAIL), 
    DATE_ADVISED date, 
    primary key REF_ADVISE_HIST (STUDENT_ID, DATE_ADVISED) 
) ENGINE = INNODB; 

insert into ADVISE_HIST values ('cmd', '[email protected]', CURRENT_DATE); 
insert into ADVISE_HIST values ('ctd', '[email protected]', CURRENT_DATE); 

Из этих последних двух вставок первые работы. Второй должен выдать ошибку ограничения внешнего ключа.

+0

Не созданы ли такие индексы автоматически, если они не существуют? – eggyal

+0

@eggyal: Нет, они не являются. –

+0

Странно. Я мог бы поклясться ... хорошо. Виноват. – eggyal

 Смежные вопросы

  • Нет связанных вопросов^_^