例如,我有4个表,即Student,School,Tour和TourAttend。旅行是在学校的基础上组织的,在同一个旅游中永远不会有来自一所以上学校的学生。
SchoolID主键
SchoolName
StudentID主键
SchoolID外键
学生名称
TourID主键
TourName
TourAttendID主键
TourID外键
StudentID外键
值的示例
Student School
Student1 School1
Student2 School1
Student3 School2
我如何确保参加1次巡回赛的学生来自完全相同的学校,这意味着来自学校的学生1参加了巡回演出,学校2不能参加该巡回演出?
答案 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
表格中StudentID
和SchoolID
添加唯一约束,方法与上面Tour
中的方式相同,在创建上述FK_TourAttend_XRefStudent
外键之前)。
您现在有一些冗余的外键约束,但我经常将它们留在原处,仅用于纪录目的。