Как использовать внешние ключи в качестве первичного ключа

У меня есть таблица с двумя внешними ключами в качестве составного ключа.

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