2016-11-03 2 views
3

Ich habe einen zusammengesetzten Primärschlüssel, den ich in eine andere Tabelle einfügen möchte.Wie fügt man einen zusammengesetzten Primärschlüssel in eine andere Tabelle ein?

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, -- foreign key -- I want this value to the be value that represents the composite PK from the courses_instructors 
primary key(studentID, courseID), -- these 2 fields combined would make the composite PK, but with the courseID value I will be able to identify who is the instructor for a course and the other details from the course_instructor table 
courseOutcome varchar(50) 
) 

der Kurs von einem Kurs Tisch kommen alle, die nur den Namen Kurs enthält und die Schüler zusammen mit einem descrption. Die Kurstabelle hat einen Primärschlüssel, der jeden Kurs eindeutig identifiziert.

Antwort

0

Um Composit-Primärschlüssel beziehen, Courses_Students Tabelle sollte die Spalten CourseID und InstructorID haben.

Und dann

ALTER TABLE Courses_Students 
ADD CONSTRAINT FK_Courses_Students 
FOREIGN KEY(CourseID, InstructorID) REFERENCES Courses_Instructors(CourseID, InstructorID) 

Oder die Tabellendefinitionen aussehen sollen,

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) 
) 
0

Sie entweder zwei Spalten beziehen können, wie bereits einen Ersatzschlüssel wie eine Identitätsspalte oder GUID erwähnt oder in der die primäre Tabelle und beziehen sich darauf - Es führt normalerweise besser aus.

0

Die Tabelle Course_Instructors ist eine Schnittstellentabelle, die eine m-m-Beziehung zwischen, wie leicht zu erraten ist, Kurs-Entities und Instructor-Entities einführt. Fast ausnahmslos füge ich keinen Ersatzschlüssel zu einer solchen Tabelle hinzu, und zwar aus dem einfachen Grund, dass ein solcher Schlüssel niemals verwendet werden würde. Ein typischer Benutzer hat eine Referenz auf die eine oder die andere Entität und möchte alle anderen Entitäten sehen, auf die er sich bezieht. Oder manchmal hat der Benutzer Referenzen auf beide Entitäten und wollte die Details ihrer Beziehung erhalten.

Diese Regel ist jedoch nicht ohne Ausnahmen, und Ihr Anwendungsfall ist nur ein solches Beispiel. Die Tabelle drückt nicht nur eine Beziehung zwischen zwei Entitäten aus, sondern wird zu einer Entität für sich selbst: ein Klassenangebot. Ein Schüler wählt eine Klasse aus einem veröffentlichten Zeitplan für die gewünschte Klasse und den gewünschten Tag/Zeit aus. Dies wird durch eine Klassencodenummer irgendeiner Art identifiziert.

Dieser Code wird für die Registrierung für die gewünschte Klasse verwendet. In solchen Fällen ist es sinnvoll, einen Surrogatschlüssel für die Schnittmenge anzulegen, der dann zum im Katalog abgedruckten Klassencode wird. Daher würden Sie diesen Klassencode verwenden, um auf die Beziehung zu verweisen, die das Klassenangebot definiert, und nicht den zusammengesetzten Schlüssel verwenden.

Es sieht so aus, als ob Sie bereits einen solchen zusammengesetzten Schlüssel haben: das course_number-Feld. Sie haben es nicht als einzigartig definiert, aber identifiziert es nicht eindeutig die Kombination aus Kurs, Kursleiter, Ort und Zeit, aus der jedes Kursangebot besteht?

Verwandte Themen