如何设置表外键值在另一个表中必须相同

时间:2016-05-16 06:21:24

标签: sql sql-server database

例如,我有4个表,即Student,School,Tour和TourAttend。旅行是在学校的基础上组织的,在同一个旅游中永远不会有来自一所以上学校的学生。

学校

SchoolID主键
SchoolName

学生

StudentID主键
SchoolID外键
学生名称

TourID主键
TourName

TourAttend

TourAttendID主键
TourID外键
StudentID外键

值的示例

Student      School      
Student1    School1    
Student2    School1     
Student3    School2  

我如何确保参加1次巡回赛的学生来自完全相同的学校,这意味着来自学校的学生1参加了巡回演出,学校2不能参加该巡回演出?

1 个答案:

答案 0 :(得分:2)

正如我在评论中所说,您可以通过在其当前缺少的表格中添加SchoolID列来实现此目的:

CREATE TABLE Tour (
    TourID tinyint not null,
    TourName varchar(37) not null,
    SchoolID bigint not null,
    constraint PK_Tour PRIMARY KEY (TourID),
    constraint FK_Tour_School FOREIGN KEY (SchoolID) references School (SchoolID),
    constraint UQ_Tour_School UNIQUE (TourID, SchoolID)
)

所以现在,就像你的叙述一样,每次巡演都与单一学校联系在一起。这很好,现在出席情况怎么样?

CREATE TABLE TourAttend (
    TourAttendID smallint not null,
    TourID tinyint not null,
    StudentID char(1) not null,
    SchoolID bigint not null,
    constraint PK_TourAttend PRIMARY KEY (TourAttendID),
    constraint FK_TourAttend_Tour FOREIGN KEY (TourID)
          references Tour (TourID),
    constraint FK_TourAttend_Student FOREIGN KEY (StudentID)
          references Student (StudentID),
    constraint FK_TourAttend_XRefTour FOREIGN KEY (TourID,SchoolID) 
          references Tour (TourID, StudentID),
    constraint FK_TourAttend_XRefStudent FOREIGN KEY (StudentID, SchoolID) 
          references Student (StudentID, SchoolID)
)

(您可能需要在Student表格中StudentIDSchoolID添加唯一约束,方法与上面Tour中的方式相同,在创建上述FK_TourAttend_XRefStudent外键之前)。

您现在有一些冗余的外键约束,但我经常将它们留在原处,仅用于纪录目的。