sql >> Base de Datos >  >> RDS >> Mysql

Use varias columnas como identificador único para mysql

Sí, MySQL ofrece la posibilidad de hacer esto.

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

No sé para qué está usando esta tabla, pero parece que esta clave única podría ser un fuerte candidato para la clave principal de la tabla. Una clave primaria también es automáticamente una clave única. Si decide convertirla en la clave principal, haga lo siguiente en su lugar:

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

(Si recibe un mensaje de error que indica que ya existe una clave principal, emita ALTER TABLE MyTable DROP PRIMARY KEY y luego repita el comando anterior).

Editar: En respuesta al comentario del usuario

No puede tener varias filas con idénticos no NULL valores 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 hace que una o ambas columnas sean anulables, puede tener múltiples filas que son idénticas hasta el posicionamiento de NULL s. Por lo tanto, podría tener dos (o más) filas donde group_id IS NULL AND user_id = 1234 .

Proviso:Lo anterior es cierto para los dos motores de almacenamiento MySQL de uso común (MyISAM e InnoDB). MySQL tiene motores de almacenamiento en los que NULL se considera un valor único, pero probablemente no los esté utilizando.

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

Supongamos que ha convertido esta clave en su clave principal y ahora desea permitir NULL en el group_id columna. No sé qué tipo de datos group_id es en este momento; Asumiré que actualmente es INT UNSIGNED NOT NULL , pero tendrá que modificar lo siguiente si no es esto. Ya no podrá usar esta clave como su clave principal. Aquí hay un comando que puede 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`)