1

我正在创建一个应用程序,该应用程序将处理和记录学生何时得到大学教员的建议,并且我需要一种有效的方法来构建表格。我的问题来自缺乏参照完整性,这是由于无法创建一个外键,该外键将仅在 ADVISE_HIST 中的复合键的一部分上引用 STUDENT,即 (STUDENT_ID,DATE_ADVISED)

这是一些表格

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),
);

我的问题是,是否有办法解决无法创建此密钥的问题,或者是否有我没有想到的更好的结构?

4

1 回答 1

0

MySQL 对外键有很多限制。其中可能会妨碍您。. .

  • 两个表都必须使用 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', 'gbrandich@thisdomain.com');

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', 'gbrandich@thisdomain.com', 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', 'gbrandich@thisdomain.com', CURRENT_DATE);
insert into ADVISE_HIST values ('ctd', 'gbrandich@thisdomain.com', CURRENT_DATE);

在最后两个插入中,第一个有效。第二个应该抛出外键约束错误。

于 2012-04-25T19:16:38.823 回答