Как я могу определить составной первичный ключ в SQL?

112

Как я могу определить составной первичный ключ, состоящий из двух полей в SQL?

Я использую PHP для создания таблиц и всего остального. Я хочу , чтобы имя таблицы votingс полями QuestionID, MemeberIDи vote. А составной первичный ключ состоит из полей QuestionIDи MemberID.

Как мне это сделать?

Зишан Ранг
источник
«И QuestionID и MemberID будут первичными ключами». (QuestionID, MemberID) будет (составным) первичным ключом . Клавиша всего одна и состоит из двух столбцов.
Draemon

Ответы:

229

Просто для пояснения: таблица может иметь не более одного первичного ключа. Первичный ключ состоит из одного или нескольких столбцов (из этой таблицы). Если первичный ключ состоит из двух или более столбцов, он называется составным первичным ключом . Это определяется следующим образом:

CREATE TABLE voting (
  QuestionID NUMERIC,
  MemberID NUMERIC,
  PRIMARY KEY (QuestionID, MemberID)
);

Тогда пара (QuestionID, MemberID) должна быть уникальной для таблицы, и ни одно из значений не может быть NULL. Если вы выполните такой запрос:

SELECT * FROM voting WHERE QuestionID = 7

он будет использовать индекс первичного ключа. Однако если вы сделаете это:

SELECT * FROM voting WHERE MemberID = 7

этого не произойдет, потому что для использования составного индекса необходимо использовать все ключи «слева». Если индекс находится в полях (A, B, C), а ваши критерии - в B и C, то этот индекс вам не нужен для этого запроса. Поэтому выберите из (QuestionID, MemberID) и (MemberID, QuestionID) тот, который больше всего подходит для того, как вы будете использовать таблицу.

При необходимости добавьте указатель на другом:

CREATE UNIQUE INDEX idx1 ON voting (MemberID, QuestionID);
Cletus
источник
5
Хороший ответ. Чтобы уточнить, QuestionID и MemberID не являются отдельными первичными ключами, а скорее их комбинация формирует уникальную пару / кортеж.
Питер
5
Есть ли преимущество в добавлении индекса по (MemberID, QuestionID)сравнению с простым MemberID? Насколько я понял, вы получаете индексированный поиск при выборе с помощью QuestionId, а также (QuestionId, MemeberId), поэтому единственным отсутствующим будет MemberIdтолько.
swalog
Я знаю, что этот ответ довольно старый, но поскольку он появился во время поиска в Google ... Кажется, есть несоответствие в тексте о том, какие столбцы используются (или нет) для индекса (а?) По умолчанию. Кроме того, предполагается, что каждая РСУБД автоматически создает индекс по первичному ключу, но, поскольку это не требуется ни одним стандартом, могут быть крайние случаи.
Кому 마 SE
Поскольку оба поля являются простыми (и, вероятно, первичными) ключами из других таблиц, в примере показан составной ключ, а не составной ключ
guymid
6
CREATE TABLE `voting` (
  `QuestionID` int(10) unsigned NOT NULL,
  `MemberId` int(10) unsigned NOT NULL,
  `vote` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`QuestionID`,`MemberId`)
);
Джастин
источник