i have a table with two foreign keys as composite key.
ActivityTbl -
(activityNbr(PK), supervisor(FK), status, type, startDate, endDate, location )
VolunteerTbl -
(volunteerNbr(PK), name, address, contact)
Now I created a table where volunteer's choices can be 开发者_Go百科stored as per their prefereance rating.
ActivityChoice
(activityNbr(FK), VolunteerNbr(FK), Rating)
So the combination of those 2 FKs make a composite key. I am using sql Server to create a table.
Create ActivityChoiceTbl(
VolunteerNbr int NOT NULL,
ActivityNbr int NOT NULL,
Rank int NOT NULL,
CONSTRAINT PKActivityChoice PRIMARY KEY (VolunteerNbr,ActivityNbr),
CONSTRAINT CKRank CHECK (Rank>0 AND Rank<=9));
So in this case do I need to add another foreign key constrain for both to mention that they are foreign keys?? Am I doing it right?? Thanks
Yes, you need two foreign key constraints. The most direct way in standard SQL is to immediately reference the table.
Create ActivityChoiceTbl(
VolunteerNbr int NOT NULL REFERENCES VolunteerTbl (volunteerNbr),
ActivityNbr int NOT NULL REFERENCES ActivityTbl (activityNbr),
Rank int NOT NULL,
CONSTRAINT PKActivityChoice PRIMARY KEY (VolunteerNbr,ActivityNbr),
CONSTRAINT CKRank CHECK (Rank>0 AND Rank<=9));
But adding two more constraint clauses lets you name the constraints, which is a better practice.
Create ActivityChoiceTbl(
VolunteerNbr int NOT NULL,
ActivityNbr int NOT NULL,
Rank int NOT NULL,
CONSTRAINT PKActivityChoice PRIMARY KEY (VolunteerNbr,ActivityNbr),
CONSTRAINT FKActivityChoiceVolunteerNbr
FOREIGN KEY (VolunteerNbr) REFERENCES VolunteerTbl (VolunteerNbr),
CONSTRAINT FKActivityChoiceActivityNbr
FOREIGN KEY (ActivityNbr) REFERENCES ActivityTbl (ActivityNbr),
CONSTRAINT CKRank CHECK (Rank>0 AND Rank<=9));
If ActivityChoice is a separate table that needs to reference ActivityChoiceTbl, then you also need something along these lines.
CREATE TABLE ActivityChoice (
VolunteerNbr INTEGER NOT NULL,
ActivityNbr INTEGER NOT NULL,
Rating DECIMAL (2,1) NOT NULL CHECK (Rating between 0 and 9), -- Pure guess
PRIMARY KEY (VolunteerNbr, ActivityNbr),
FOREIGN KEY (VolunteerNbr, ActivityNbr)
REFERENCES ActivityChoiceTbl (VolunteerNbr, ActivityNbr)
);
I would suggest you have a separate single PrimaryKey in ActivityChoice table. Make VolunteerNbr and ActivityNbr foreign keys and add a composite unique key constraint for two columns VolunteerNbr, ActivityNbr.
Some of the viewpoints you would like to take a look at, about composite foreign key. http://www.upsizing.co.uk/Art10_MultiPartkeys.aspx
http://social.msdn.microsoft.com/Forums/en/transactsql/thread/158d77f7-3029-43bc-bba6-a8a12374f00c
精彩评论