2009-07-10 34 views
80

¿Cómo puedo definir una clave primaria compuesta que consta de dos campos en SQL?¿Cómo puedo definir una clave primaria compuesta en SQL?

Estoy usando PHP para crear tablas y todo. Quiero hacer una tabla con el nombre voting con los campos QuestionID, MemeberID y vote. Y la clave primaria compuesta está compuesta por los campos QuestionID y MemberID.

¿Cómo debo hacer esto?

+0

"Y el IdPregunta y MemberID serán las claves primarias." (QuestionID, MemberID) será la clave primaria (compuesta) *. Solo hay una clave y consta de dos columnas. – Draemon

Respuesta

162

Solo para aclaración: una tabla puede tener como máximo una clave principal. Una clave principal consta de una o más columnas (de esa tabla). Si una clave principal consta de dos o más columnas, se llama clave principal compuesta. Se define como sigue:

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

El par (IdPregunta, MemberID), entonces debe ser único para la mesa y ni valor puede ser NULL. Si realiza una consulta como esta:

SELECT * FROM voting WHERE QuestionID = 7 

usará el índice de la clave principal. Sin embargo, si hace esto:

SELECT * FROM voting WHERE MemberID = 7 

no lo hará porque para usar un índice compuesto es necesario utilizar todas las teclas de la "izquierda". Si un índice está en los campos (A, B, C) y sus criterios están en B y C, ese índice no le sirve para esa consulta. Así que elija entre (Id. De pregunta, Id. De miembro) y (Id. De pregunta, Id. De pregunta) el que sea más apropiado para la forma en que usará la tabla.

Si es necesario, añadir un índice en el otro:

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

Buena respuesta. Solo para aclarar, QuestionID y MemberID no son claves primarias separadas, sino que la combinación de ellas forma un par único/tupla. – Peter

+4

¿Hay algún beneficio al agregar índice en '(MemberID, QuestionID)', en lugar de simplemente 'MemberID'? Por lo que yo entiendo, se obtiene la búsqueda indexada cuando se selecciona con 'QuestionId', y también' (QuestionId, MemeberId) ', por lo que el único que falta sería' MemberId' solamente. – swalog

+0

Sé que esta respuesta es bastante antigua, pero dado que apareció durante una búsqueda en Google ... Parece que hay una incoherencia en el texto acerca de qué columnas se utilizan (o no) para el índice predeterminado (¿?). Además, se supone que cada RDBMS creará automáticamente un índice en la clave principal, pero dado que no es requerido por ningún estándar, puede haber casos de esquina. –

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`) 
); 
Cuestiones relacionadas