Как использовать внешние ключи в качестве первичного ключа
У меня есть таблица с двумя внешними ключами в качестве составного ключа.
ActivityTbl -
(activityNbr(PK), supervisor(FK), status, type, startDate, endDate, location )
VolunteerTbl -
(volunteerNbr(PK), name, address, contact)
Теперь я создал таблицу, в которой можно сохранить выбор волонтеров в соответствии с их рейтингом предпочтений.
ActivityChoice
(activityNbr(FK), VolunteerNbr(FK), Rating)
Таким образом, комбинация этих 2-х FK создает составной ключ. Я использую SQL Server для создания таблицы.
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));
Так что в этом случае мне нужно добавить другое ограничение внешнего ключа для обоих, чтобы упомянуть, что они являются внешними ключами? Я делаю это правильно? Спасибо
2 ответа
Да, вам нужно два ограничения внешнего ключа. Самый прямой способ в стандартном SQL - это немедленно обратиться к таблице.
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));
Но добавление еще двух предложений об ограничениях позволяет вам называть ограничения, что является лучшей практикой.
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));
Если ActivityChoice - это отдельная таблица, которая должна ссылаться на ActivityChoiceTbl, то вам также нужно что-то в этом роде.
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)
);
Я хотел бы предложить вам отдельный отдельный PrimaryKey в таблице ActivityChoice. Создайте внешние ключи VolunteerNbr и ActivityNbr и добавьте ограничение составного уникального ключа для двух столбцов VolunteerNbr, ActivityNbr.
Некоторые точки зрения, на которые вы хотели бы взглянуть, о составном внешнем ключе. http://www.upsizing.co.uk/Art10_MultiPartkeys.aspx
http://social.msdn.microsoft.com/Forums/en/transactsql/thread/158d77f7-3029-43bc-bba6-a8a12374f00c