Wie kann ich einen zusammengesetzten Primärschlüssel in SQL definieren?

112

Wie kann ich in SQL einen zusammengesetzten Primärschlüssel definieren, der aus zwei Feldern besteht?

Ich benutze PHP, um Tabellen und alles zu erstellen. Ich möchte einen Tabellennamen machen , votingmit Feldern QuestionID, MemeberIDund vote. Der zusammengesetzte Primärschlüssel besteht aus den Feldern QuestionIDund MemberID.

Wie soll ich das machen?

Zeeshan Rang
quelle
"Und die QuestionID und MemberID werden die Primärschlüssel sein." (QuestionID, MemberID) wird der (composite) primär sein Schlüssel . Es gibt nur einen Schlüssel und er besteht aus zwei Spalten.
Draemon

Antworten:

229

Nur zur Verdeutlichung: Eine Tabelle kann höchstens einen Primärschlüssel haben. Ein Primärschlüssel besteht aus einer oder mehreren Spalten (aus dieser Tabelle). Wenn ein Primärschlüssel aus zwei oder mehr Spalten besteht, wird er als zusammengesetzter Primärschlüssel bezeichnet . Es ist wie folgt definiert:

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

Das Paar (QuestionID, MemberID) muss dann für die Tabelle eindeutig sein und keiner der Werte darf NULL sein. Wenn Sie eine Abfrage wie folgt durchführen:

SELECT * FROM voting WHERE QuestionID = 7

Es wird der Index des Primärschlüssels verwendet. Wenn Sie dies jedoch tun:

SELECT * FROM voting WHERE MemberID = 7

Dies ist nicht der Fall, da für die Verwendung eines zusammengesetzten Index alle Schlüssel von "links" verwendet werden müssen. Wenn sich ein Index auf Feldern (A, B, C) befindet und Ihre Kriterien auf B und C liegen, ist dieser Index für diese Abfrage für Sie nicht von Nutzen. Wählen Sie also zwischen (QuestionID, MemberID) und (MemberID, QuestionID), je nachdem, was für die Verwendung der Tabelle am besten geeignet ist.

Fügen Sie bei Bedarf einen Index hinzu:

CREATE UNIQUE INDEX idx1 ON voting (MemberID, QuestionID);
Cletus
quelle
5
Gute Antwort. Zur Verdeutlichung sind QuestionID und MemberID keine separaten Primärschlüssel, sondern die Kombination bildet ein eindeutiges Paar / Tupel.
Peter
5
Gibt es einen Vorteil beim Hinzufügen eines Index im (MemberID, QuestionID)Gegensatz zu nur MemberID? Soweit ich verstanden habe, erhalten Sie bei der Auswahl mit QuestionIdund auch eine indizierte Suche (QuestionId, MemeberId), sodass nur die einzige fehlt MemberId.
Swalog
Ich weiß, dass diese Antwort ziemlich alt ist, aber da sie während einer Google-Suche aufgetaucht ist ... Es scheint eine Inkonsistenz im Text darüber zu geben, welche Spalten für die Standardindizes verwendet werden (oder nicht). Darüber hinaus wird davon ausgegangen, dass jedes RDBMS automatisch einen Index für den Primärschlüssel erstellt. Da dies jedoch von keinem Standard verlangt wird, kann es zu Eckfällen kommen.
Bis zum
Da beide Felder einfache (und wahrscheinlich primäre) Schlüssel aus anderen Tabellen sind, zeigt das Beispiel einen zusammengesetzten Schlüssel, keinen zusammengesetzten Schlüssel
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
quelle