Jak mogę zdefiniować złożony klucz podstawowy w SQL?

112

Jak zdefiniować złożony klucz podstawowy składający się z dwóch pól w języku SQL?

Używam PHP do tworzenia tabel i wszystkiego. Chcę, aby nazwę tabeli votingz polami QuestionID, MemeberIDoraz vote. A złożony klucz podstawowy składa się z pól QuestionIDi MemberID.

Jak mam to zrobić?

Zeeshan Rang
źródło
„A QuestionID i MemberID będą kluczami podstawowymi”. (QuestionID, MemberID) będzie (złożonym) kluczem podstawowym . Jest tylko jeden klucz i składa się z dwóch kolumn.
Draemon,

Odpowiedzi:

229

Dla wyjaśnienia: tabela może mieć co najwyżej jeden klucz podstawowy. Klucz podstawowy składa się z co najmniej jednej kolumny (z tej tabeli). Jeśli klucz podstawowy składa się z dwóch lub więcej kolumn, nazywany jest złożonym kluczem podstawowym . Jest zdefiniowany w następujący sposób:

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

Para (QuestionID, MemberID) musi wtedy być unikalna dla tabeli i żadna z wartości nie może mieć wartości NULL. Jeśli wykonasz takie zapytanie:

SELECT * FROM voting WHERE QuestionID = 7

użyje indeksu klucza podstawowego. Jeśli jednak to zrobisz:

SELECT * FROM voting WHERE MemberID = 7

tak się nie stanie, ponieważ użycie indeksu złożonego wymaga użycia wszystkich klawiszy od „lewej”. Jeśli indeks znajduje się na polach (A, B, C), a twoje kryteria znajdują się na B i C, to ten indeks nie jest dla ciebie przydatny dla tego zapytania. Więc wybierz spośród (QuestionID, MemberID) i (MemberID, QuestionID) w zależności od tego, co jest najbardziej odpowiednie do tego, jak będziesz korzystać z tabeli.

W razie potrzeby dodaj indeks na drugim:

CREATE UNIQUE INDEX idx1 ON voting (MemberID, QuestionID);
cletus
źródło
5
Dobra odpowiedź. Dla wyjaśnienia, QuestionID i MemberID nie są oddzielnymi kluczami podstawowymi, ale raczej ich kombinacja tworzy unikalną parę / krotkę.
Peter
5
Czy jest korzyść z dodawania indeksu (MemberID, QuestionID), a nie tylko MemberID? O ile zrozumiałem, po wybraniu za pomocą QuestionId, a także otrzymasz indeksowane wyszukiwanie (QuestionId, MemeberId), więc jedynym brakującym będzie MemberIdtylko.
swalog
Wiem, że ta odpowiedź jest dość stara, ale ponieważ pojawiła się podczas wyszukiwania w Google ... Wygląda na to, że w tekście występuje niespójność co do tego, które kolumny są używane (lub nie) dla domyślnego indeksu (ów?). Ponadto zakłada, że ​​każdy RDBMS automatycznie utworzy indeks na kluczu podstawowym, ale ponieważ nie jest to wymagane przez żaden standard, mogą istnieć przypadki narożne.
Do 마 SE
Ponieważ oba pola są prostymi (i prawdopodobnie głównymi) kluczami z innych tabel, przykład pokazuje klucz złożony, a nie klucz złożony
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`)
);
Justin
źródło