Як я можу визначити складений первинний ключ у 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);

5
Хороша відповідь. Для уточнення, QuestionID та MemberID не є окремими первинними ключами, а навпаки, їх комбінація утворює унікальну пару / кортеж.
Пітер

5
Чи є користь від додавання індексу на (MemberID, QuestionID), а не просто MemberID? Наскільки я зрозумів, ви отримуєте індексований пошук під час вибору за допомогою QuestionId, а також (QuestionId, MemeberId), тому єдиний зниклий був би MemberIdлише.
swalog

Я знаю, що ця відповідь досить стара, але оскільки вона з’явилася під час пошуку в Google ... Здається, в тексті є невідповідність того, які стовпці використовуються (чи ні) для індексу за замовчуванням (і?). Крім того, передбачається, що кожен RDBMS автоматично створюватиме індекс на первинному ключі, але оскільки це не вимагається жодним стандартом, там можуть бути кутові випадки.
До 마 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`)
);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.