web-dev-qa-db-fra.com

Comment définir une clé primaire composite en SQL?

Comment définir une clé primaire composite composée de deux champs en SQL?

J'utilise PHP pour créer des tables et tout le reste. Je veux créer un nom de table voting avec des champs QuestionID, MemeberID et vote. Et la clé primaire composite est constituée des champs QuestionID et MemberID.

Comment dois-je faire cela?

96
Zeeshan Rang

Juste pour clarifier: une table peut avoir au plus une clé primaire. Une clé primaire consiste en une ou plusieurs colonnes (de cette table). Si une clé primaire est composée 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 valeur 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 cela:

SELECT * FROM voting WHERE MemberID = 7

ce ne sera pas parce que pour utiliser un index composite nécessite d'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, alors cet index ne vous sera d'aucune utilité pour cette requête. Choisissez donc entre (QuestionID, MemberID) et (MemberID, QuestionID) selon ce qui convient le mieux à l’utilisation du tableau.

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

CREATE UNIQUE INDEX idx1 ON voting (MemberID, QuestionID);
200
cletus
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`)
);
6
Justin