1

私が抱えている特定の問題についてお聞きしたいのですが。

たとえば、 aとaStudentを持つテーブルがあり、どちらもとテーブルへの外部キーです。テーブルには、テーブルへの外部キーである列があります。SchoolIDClassIDSchoolClassroomClassSchoolIDSchool

テーブル内ClassIDのがの子であることを確認する方法はありますか、それとも、起こりうる不一致を防ぐために、を削除してそのまま使用する必要がありますか?StudentSchoolIDSchoolIDClassID

4

3 に答える 3

2

はい、技術的にはStudent.SchoolId、Classにすでにが含まれている場合は、外部キーを削除する必要があります。SchoolIdこれは、との間の関係をすでに定義しているためです。StudentSchool

とはいえ、これにはいくつかの一般的な「例外」があります。例:

  1. との関係がとの関係StudentSchoolは異なる意味を持つ可能性がある場合(たとえば、生徒が「本校」としてX校に通うが、Z校の追加の壁画クラスYにも通う場合)。(実際には、これはモデリングエラーを浮き彫りにする可能性があります。つまり、学生:クラスは実際には多対多の関係である可能性があります)ClassSchool

  2. パフォーマンス上の理由から、親に再度参加する必要がないように、親の外部キーを子に追加することが(やや気が進まない)選択になることがあります。しかし、あなたが言うように、これは完全性の問題を引き起こす可能性があります。

于 2012-08-21T08:46:34.187 に答える
1

はい、Classesテーブルへの外部キー参照に複数の列を含めることで、それを強制できます。

create table Schools (
    SchoolID int not null primary key,
    Name varchar(30) not null unique
)
go
create table Classes (
    ClassID int not null primary key,
    SchoolID int not null foreign key references Schools (SchoolID),
    Name varchar(30) not null,
    constraint UQ_Class_Schools UNIQUE (ClassID,SchoolID),
    constraint UQ_Class_Names UNIQUE (SchoolID,Name)
)
go
create table Students (
    StudentID int not null primary key,
    SchoolID int not null foreign key references Schools (SchoolID),
    ClassID int not null,
    Name varchar(95) not null,
    constraint FK_Student_Classes FOREIGN KEY (ClassID,SchoolID) references Classes (ClassID,SchoolID)
)

好みに応じて、両方のテーブルの列で外部キーを宣言することもできますClassID

于 2012-08-21T08:49:59.450 に答える
0

StudentテーブルはClassを参照する必要があります。

create table Student (
  ...
  SchoolID integer not null,
  ClassID integer not null,
  foreign key (SchoolID, ClassID) references Class (SchoolID, ClassID),
  ...
);

次に、ClassテーブルはSchoolを参照する必要があります。

于 2012-08-21T08:46:44.757 に答える