1

学生が大学の教職員からアドバイスを受けたときに処理および記録するアプリケーションを作成しており、テーブルを効果的に構成する方法が必要です。私の問題は、(STUDENT_ID,DATE_ADVISED) である ADVISE_HIST の複合キーの一部のみで STUDENT を参照する外部キーを作成できないことが原因で、参照整合性の欠如から生じています。

ここにいくつかのテーブルがあります

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

これらの最後の2つの挿入のうち、最初の挿入は機能します。2つ目は、外部キー制約エラーをスローする必要があります。

于 2012-04-25T19:16:38.823 に答える