2009-07-10 33 views
80

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

Sto usando PHP per creare tabelle e tutto. Voglio fare un nome di tabella voting con campi QuestionID, MemeberID e vote. E la chiave primaria composta è composta dai campi QuestionID e MemberID.

Come devo fare?

+0

"E il QuestionID e MemberID saranno le chiavi primarie." (QuestionID, MemberID) sarà il (primario) * tasto * composito *. C'è solo una chiave e consiste di due colonne. – Draemon

risposta

162

Solo per chiarimenti: una tabella può avere al massimo una chiave primaria. Una chiave primaria consiste di una o più colonne (da quella tabella). Se una chiave primaria è composta da due o più colonne, viene chiamata una chiave primaria composita . Esso è definito come segue:

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

La coppia (QuestionID, MemberID) deve quindi essere univoco per la tabella e né valore può essere NULL. Se si esegue una query come questa:

SELECT * FROM voting WHERE QuestionID = 7 

utilizzerà l'indice della chiave primaria. Se tuttavia si esegue questa operazione:

SELECT * FROM voting WHERE MemberID = 7 

non sarà a causa di utilizzare un indice composito richiede l'utilizzo di tutti i tasti di "sinistra". Se un indice è nei campi (A, B, C) e il tuo criterio è su B e C, allora quell'indice non ti è utile per quella query. Quindi scegliere tra (QuestionID, MemberID) e (MemberID, QuestionID) qualunque sia il modo più appropriato per utilizzare la tabella.

Se necessario, aggiungere un indice d'altro:

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

Buona risposta. Giusto per chiarire, QuestionID e MemberID non sono chiavi primarie separate, ma piuttosto la combinazione di esse forma una coppia/tupla unica. – Peter

+4

C'è un vantaggio nell'aggiunta dell'indice su '(MemberID, QuestionID)', al contrario di solo 'MemberID'? Per quanto ho capito, si ottiene una ricerca indicizzata quando si seleziona con 'QuestionId', e anche' (QuestionId, MemeberId) ', quindi l'unica mancante sarebbe 'MemberId' solo. – swalog

+0

So che questa risposta è piuttosto vecchia ma poiché è comparsa durante una ricerca su google ... Sembra che ci sia un'incoerenza nel testo riguardo a quali colonne vengono usate (o meno) per l'indice di default (es?). Inoltre, presuppone che ogni RDBMS creerà automaticamente un indice sulla chiave primaria, ma dal momento che non è richiesto da nessuno standard, potrebbero esserci casi angolari. –

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`) 
); 
Problemi correlati