例如,我有4张桌子,即Student,School,Tour和TourAttend。游览是在学校的基础上进行的,同一游览中绝不会有来自多所学校的学生。
SchoolID主键
SchoolName
StudentID主键
SchoolID外键
StudentName
TourID主键
TourName
TourAttendID主键
TourID外键
StudentID外键
价值的例子
Student School
Student1 School1
Student2 School1
Student3 School2
我如何确保参加同一学校的一次旅行的学生,这意味着如果来自school1的学生参加了旅行,school2无法参加该旅行?
正如我在评论中所说,您可以通过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
外键)。
您现在有一些多余的外键约束,但是我经常将它们留在原处,仅用于记录目的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句