2010-09-26 23 views
41

que tienen una tabla de MySQL con las siguientes columnas:Use varias columnas como identificador único para MySQL

group_id 
game_id 
user_id 
message 
last_update 

quiero hacerlo de modo que no pueden existir dos filas en las que el valor de group_id para la fila x es igual al valor de group_id para la fila Y y el valor de user_id para la fila x también es igual al valor de user_id para la fila y.

Así, por ejemplo, digamos que puedo insertar los siguientes valores siguientes:

group_id = 783 
game_id = 34 
user_id = 29237 
message = none 
last_update = 11233452 

Los datos anteriores, incluso si una consulta MySQL intenta insertarlo, no debe crear una nueva fila si ya existe una fila con la misma combinación de group_id y user_id. ¿Hay alguna forma de hacer esto? Básicamente, estoy intentando que dos columnas funcionen juntas, como un índice único.

+0

¿Hay algún motivo por el que group_id y user_id no sean las claves principales de esta tabla? – Gus

+0

Se establecen como índices, pero ¿establecerse en primario hace la diferencia para tratar de lograr la tarea? Si es así, puedo hacerlos primarios. – user396404

Respuesta

82

Sí, MySQL proporciona la capacidad de hacer esto.

ALTER TABLE MyTable 
ADD UNIQUE KEY `my_unique_key` (`group_id`, `user_id`) 

No sé lo que estás utilizando esta tabla para obtener, pero suena como esta clave única puede ser un fuerte candidato para la clave primaria de la tabla. Una clave principal también es automáticamente una clave única. Si decide que sea la clave principal, a continuación, hacer lo siguiente en su lugar:

ALTER TABLE MyTable 
ADD PRIMARY KEY (`group_id`, `user_id`) 

(. Si recibe un mensaje de error que ya hay una clave principal, a continuación, emitir ALTER TABLE MyTable DROP PRIMARY KEY y luego repetir el comando anterior)

Editar : En respuesta a los comentarios del usuario

no se puede tener múltiples filas con idénticos valores no NULL para las columnas cubiertas por la clave única. Por lo tanto, no puede tener dos filas donde group_id = 0 AND user_id = 5, por ejemplo. 0 es un valor. Pero si haces una o ambas de las columnas anulables, que puede tienen varias filas que son idénticos hasta el posicionamiento de NULL s. Por lo que podría tener dos (o más) filas donde group_id IS NULL AND user_id = 1234.

Proviso: Lo anterior es cierto tanto para los motores de almacenamiento de MySQL comúnmente utilizadas (MyISAM y InnoDB). MySQL tiene motores de almacenamiento en los que NULL se considera un valor único, pero es probable que no los esté usando.

Si hace que una o ambas columnas sean nulables, su clave única no puede ser la clave principal; la clave principal debe estar en las columnas que son NOT NULL.

Supongamos que ha convertido esta clave en su clave principal y ahora desea permitir NULL en la columna group_id. No sé qué tipo de datos es group_id en este momento; Asumiré que actualmente es INT UNSIGNED NOT NULL, pero tendrá que modificar el siguiente si no es esto. Ya no podrá usar esta clave como su clave principal. Aquí hay un comando que podría ejecutar para realizar los cambios deseados:

ALTER TABLE MyTable 
    DROP PRIMARY KEY, 
    MODIFY group_id INT UNSIGNED, 
    ADD UNIQUE KEY `my_unique_key_with_nulls` (`group_id`, `user`) 
+1

Muchas gracias. – user396404

+0

¿Es posible hacerlo de modo que solo funcionen juntos como clave principal/única solo si group_id! = '0'? – user396404

+0

Ver respuesta editada – Hammerite

0

bien para esto puede crear clave compuesta de group_id y USER_ID usando cualquier editor de MySQL como phpMyAdmin o sqlyog, y se marca como índice único.

Cuestiones relacionadas