2009-07-10 12 views
80

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

Używam PHP do tworzenia tabel i wszystkiego. Chcę utworzyć nazwę tabeli voting z polami QuestionID, MemeberID i vote. Klucz podstawowy złożony składa się z pól QuestionID i .

Jak powinienem to zrobić?

+0

„A QuestionID i MemberID będzie klucze podstawowe”. (QuestionID, MemberID) będzie (złożonym) podstawowym * kluczem *. Jest tylko jeden klucz i składa się z dwóch kolumn. – Draemon

Odpowiedz

162

Dla jasności: tabela może mieć najwyżej jeden klucz podstawowy. Klucz podstawowy składa się z jednej lub więcej kolumn (z tej tabeli). Jeśli klucz podstawowy składa się z dwóch lub więcej kolumn, nazywa się złożony klucz podstawowy . Jest ona zdefiniowana w następujący sposób:

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

para (QuestionID, MemberID) musi być unikalny dla tabeli ani wartość może być 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 

nie będzie, 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 dotyczą B i C, to ten indeks nie przydaje się dla ciebie w tym zapytaniu. Więc wybierz (QuestionID, MemberID) i (MemberID, QuestionID), który z nich jest najbardziej odpowiedni do tego, jak będziesz korzystać z tabeli.

W razie potrzeby dodać indeks na drugiej:

CREATE UNIQUE INDEX idx1 ON voting (MemberID, QuestionID); 
+3

Dobra odpowiedź. Dla wyjaśnienia, QuestionID i MemberID nie są oddzielnymi kluczami głównymi, ale połączenie ich tworzy unikalną parę/krotkę. – Peter

+4

Czy istnieje korzyść dodawania indeksu na '(MemberID, QuestionID)', a nie tylko 'MemberID'? Z tego co rozumiem, dostajesz indeksowane wyszukiwanie przy wyborze 'QuestionId', a także' (QuestionId, MemeberId) ', więc jedynym brakującym będzie tylko' MemberId'. – swalog

+0

Wiem, że ta odpowiedź jest dość stara, ale odkąd pojawiła się podczas wyszukiwania google ... Wydaje się, że w tekście jest niespójność co do kolumn używanych (lub nie) do domyślnego indeksu (es?). Ponadto zakłada, że ​​każdy RDBMS automatycznie utworzy indeks na kluczu podstawowym, ale ponieważ nie jest wymagany przez żaden standard, mogą istnieć przypadki narożne. –

5
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`) 
); 
Powiązane problemy