Come posso definire una chiave primaria composita in SQL?


112

Come posso definire una chiave primaria composta composta da due campi in SQL?

Sto usando PHP per creare tabelle e tutto il resto. Voglio fare un nome di tabella votingcon i campi QuestionID, MemeberIDe vote. E la chiave primaria Composite è costituita dai campi QuestionIDe MemberID.

Come dovrei farlo?


"E QuestionID e MemberID saranno le chiavi primarie." (QuestionID, MemberID) sarà la chiave primaria (composita) . C'è solo una chiave ed è composta da due colonne.
Draemon

Risposte:


229

Giusto per chiarimento: una tabella può avere al massimo una chiave primaria. Una chiave primaria è costituita da una o più colonne (da quella tabella). Se una chiave primaria è composta da due o più colonne, viene chiamata chiave primaria composta . È definito come segue:

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

La coppia (QuestionID, MemberID) deve quindi essere univoca per la tabella e nessuno dei due valori può essere NULL. Se esegui una query come questa:

SELECT * FROM voting WHERE QuestionID = 7

userà l'indice della chiave primaria. Se invece fai questo:

SELECT * FROM voting WHERE MemberID = 7

non è così perché per usare un indice composto è necessario utilizzare tutte le chiavi da "sinistra". Se un indice è sui campi (A, B, C) ei tuoi criteri sono su B e C, quell'indice non è di alcuna utilità per quella query. Quindi scegli tra (QuestionID, MemberID) e (MemberID, QuestionID) a seconda di quale è più appropriato per come utilizzerai la tabella.

Se necessario, aggiungi un indice sull'altro:

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

5
Buona risposta. Giusto per chiarire, QuestionID e MemberID non sono chiavi primarie separate, ma piuttosto la loro combinazione forma una coppia / tupla univoca.
Peter

5
C'è un vantaggio nell'aggiungere l'indice (MemberID, QuestionID), rispetto al solo MemberID? Per quanto ho capito, ottieni una ricerca indicizzata quando selezioni con QuestionId, e inoltre (QuestionId, MemeberId), quindi l'unico mancante sarebbe MemberIdsolo.
Swalog

So che questa risposta è piuttosto vecchia ma dal momento che è comparsa durante una ricerca su Google ... Sembra che ci sia un'incongruenza nel testo su quali colonne vengono utilizzate (o meno) per gli indici predefiniti. Inoltre, si presume che ogni RDBMS creerà automaticamente un indice sulla chiave primaria, ma poiché non è richiesto da nessuno standard, potrebbero esserci casi d'angolo là fuori.
A 마 SE

Poiché entrambi i campi sono chiavi semplici (e probabilmente primarie) di altre tabelle, l'esempio mostra una chiave composta non una chiave composta
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`)
);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.