¿Cómo puedo definir una clave primaria compuesta en SQL?

112

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

Estoy usando PHP para crear tablas y todo. Quiero hacer un nombre de tabla votingcon los campos QuestionID, MemeberIDy vote. Y la clave principal compuesta consta de los campos QuestionIDy MemberID.

¿Cómo debería hacer esto?

Zeeshan Rang
fuente
"Y QuestionID y MemberID serán las claves principales". (QuestionID, MemberID) será la clave principal (compuesta) . Solo hay una clave y consta de dos columnas.
Draemon

Respuestas:

229

Solo para aclarar: una tabla puede tener como máximo una clave primaria. Una clave principal consta de una o más columnas (de esa tabla). Si una clave primaria consta de dos o más columnas, se denomina clave primaria compuesta . Se define de la siguiente manera:

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

El par (QuestionID, MemberID) debe ser único para la tabla y ninguno de los valores puede ser NULL. Si realiza una consulta como esta:

SELECT * FROM voting WHERE QuestionID = 7

utilizará el índice de la clave principal. Sin embargo, si haces esto:

SELECT * FROM voting WHERE MemberID = 7

no lo hará porque para usar un índice compuesto es necesario usar todas las claves de la "izquierda". Si un índice está en los campos (A, B, C) y sus criterios están en B y C, entonces ese índice no le sirve para esa consulta. Por lo tanto, elija entre (QuestionID, MemberID) y (MemberID, QuestionID) lo que sea más apropiado para cómo usará la tabla.

Si es necesario, agregue un índice en el otro:

CREATE UNIQUE INDEX idx1 ON voting (MemberID, QuestionID);
cletus
fuente
5
Buena respuesta. Solo para aclarar, QuestionID y MemberID no son claves primarias separadas, sino que la combinación de ellas forma un par / tupla único.
Peter
5
¿Hay algún beneficio al agregar índice (MemberID, QuestionID), en lugar de solo MemberID? Por lo que tengo entendido, obtienes una búsqueda indexada al seleccionar con QuestionId, y también (QuestionId, MemeberId), por lo que el único que falta sería MemberIdonly.
swalog
Sé que esta respuesta es bastante antigua, pero como apareció durante una búsqueda en Google ... Parece que hay una inconsistencia en el texto sobre qué columnas se usan (o no) para los índices predeterminados (¿?). Además, asume que cada RDBMS creará automáticamente un índice en la clave principal, pero como no es requerido por ningún estándar, puede haber casos de esquina por ahí.
Hasta 마 SE
Debido a que ambos campos son claves simples (y probablemente primarias) de otras tablas, el ejemplo muestra una clave compuesta, no una clave compuesta
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
fuente