Comment puis-je définir une clé primaire composite dans SQL?

112

Comment puis-je définir une clé primaire composite composée de deux champs dans SQL?

J'utilise PHP pour créer des tableaux et tout. Je veux faire un nom de table votingavec des champs QuestionID, MemeberIDet vote. Et la clé primaire composite se compose des champs QuestionIDet MemberID.

Comment dois-je faire cela?

Zeeshan Rang
la source
"Et le QuestionID et MemberID seront les clés primaires." (QuestionID, MemberID) sera la clé primaire (composite) . Il n'y a qu'une seule clé et elle se compose de deux colonnes.
Draemon

Réponses:

229

Juste pour clarifier: une table peut avoir au plus une clé primaire. Une clé primaire se compose d'une ou plusieurs colonnes (de cette table). Si une clé primaire se compose de deux colonnes ou plus, elle est appelée clé primaire composite . Il est défini comme suit:

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

La paire (QuestionID, MemberID) doit alors être unique pour la table et aucune des deux valeurs ne peut être NULL. Si vous faites une requête comme celle-ci:

SELECT * FROM voting WHERE QuestionID = 7

il utilisera l'index de la clé primaire. Si toutefois vous faites ceci:

SELECT * FROM voting WHERE MemberID = 7

ce ne sera pas le cas car pour utiliser un index composite, il faut utiliser toutes les clés de la «gauche». Si un index est sur des champs (A, B, C) et que vos critères sont sur B et C, cet index ne vous est d'aucune utilité pour cette requête. Choisissez donc parmi (QuestionID, MemberID) et (MemberID, QuestionID) celui qui convient le mieux à la manière dont vous utiliserez la table.

Si nécessaire, ajoutez un index sur l'autre:

CREATE UNIQUE INDEX idx1 ON voting (MemberID, QuestionID);
cletus
la source
5
Bonne réponse. Juste pour clarifier, QuestionID et MemberID ne sont pas des clés primaires séparées mais plutôt leur combinaison forme une paire / un tuple unique.
Peter
5
Y a-t-il un avantage à ajouter un index sur (MemberID, QuestionID), plutôt que juste MemberID? Pour autant que je sache, vous obtenez une recherche indexée lors de la sélection avec QuestionId, et (QuestionId, MemeberId)donc le seul manquant serait le MemberIdseul.
swalog
Je sais que cette réponse est assez ancienne, mais depuis qu'elle est apparue lors d'une recherche Google ... Il semble qu'il y ait une incohérence dans le texte sur les colonnes utilisées (ou non) pour le ou les index par défaut?). De plus, cela suppose que chaque SGBDR créera automatiquement un index sur la clé primaire, mais comme il n'est requis par aucune norme, il peut y avoir des cas de coin.
au 마 SE
Étant donné que les deux champs sont des clés simples (et probablement primaires) d'autres tables, l'exemple montre une clé composée et non une clé composite
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
la source