我有一个复合主键,我想插入另一个表。
<#attempt>
所有课程都来自一个课程表,其中只包含课程名称和门徒以及描述。课程表有一个主键,可以唯一标识每个课程。
答案 0 :(得分:0)
要引用composit主键,Courses_Students表应该同时包含CourseID和InstructorID列。
然后
ALTER TABLE Courses_Students
ADD CONSTRAINT FK_Courses_Students
FOREIGN KEY(CourseID, InstructorID) REFERENCES Courses_Instructors(CourseID, InstructorID)
或者表定义应该如下,
create table courses_instructors
(
courseID int foreign key references Course(C_ID) not null,
instructorID int foreign key references Instructor(I_ID) not null,
primary key (courseID, instructorID), --coourseID and instructorID combined is the composite PK
courseTerm varchar(50) not null,
courseNumber int not null,
courseLocation varchar(50),
courseTime varchar(50),
courseMaxOccupancy int,
courseSeatAvailable int
)
create table courses_students
(
studentID int foreign key references student(S_ID) not null,
courseID int,
instructorId int,
FOREIGN KEY(CourseID, InstructorID) REFERENCES Courses_Instructors(CourseID, InstructorID),
primary key(studentID, courseID, InstructorId),
courseOutcome varchar(50)
)
答案 1 :(得分:0)
您可以像前面提到的那样引用两列,或者将一个代理键(例如标识列或GUID)添加到主表中并引用它 - 它通常表现更好。
答案 2 :(得分:0)
course_instructors表是一个交集表,实现了课程实体和教师实体之间的m-m关系,可能很容易猜到。几乎无一例外,我没有为这样的表添加代理键,原因很简单,因为这样的密钥永远不会被使用。典型用户具有对一个实体或另一个实体的引用,并希望看到与其相关的所有其他实体。或者有时用户可以引用这两个实体,并希望获得他们关系的详细信息。
然而,这条规则并非没有例外,您的用例就是这样一个例子。该表不仅表达了两个实体之间的关系,而且成为了一个实体:一个类提供。学生将从已发布的课程表和所需的日期/时间中选择一个班级。这将通过某种类代码编号来识别。
此代码将用于注册所需的类。在这种情况下,为交集表创建一个代理键是有意义的 - 然后它成为目录中打印的类代码。因此,您将使用此类代码来引用定义类提供的关系,并且不使用组合键。
看起来你已经有了这样一个复合键:course_number字段。您没有将它定义为唯一,但它不能唯一地标识组成每个课程的课程,讲师,地点和时间的组合吗?