¿Cómo especifico una restricción única para múltiples columnas en MySQL?

Tengo una mesa:

table votes ( id, user, email, address, primary key(id), ); 

Ahora quiero que las columnas usuario, correo electrónico y dirección sean únicas (juntas).

¿Cómo hago esto en MySql?

  • Por supuesto, el ejemplo es solo … un ejemplo. Entonces, por favor, no te preocupes por la semántica.

 ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`); 

Tengo una tabla de MySQL:

 CREATE TABLE `content_html` ( `id` int(11) NOT NULL AUTO_INCREMENT, `id_box_elements` int(11) DEFAULT NULL, `id_router` int(11) DEFAULT NULL, `content` mediumtext COLLATE utf8_czech_ci NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id_box_elements` (`id_box_elements`,`id_router`) ); 

y la ÚNICA CLAVE funciona tal como se esperaba, permite múltiples filas NULL de id_box_elements e id_router.

Estoy ejecutando MySQL 5.1.42, así que probablemente hubo alguna actualización sobre el tema discutido anteriormente. Afortunadamente funciona y espero que así sea.

Los índices únicos de varias columnas no funcionan en MySQL si tiene un valor NULL en la fila ya que MySQL trata a NULL como un valor único y al menos actualmente no tiene lógica para solucionarlo en índices de varias columnas. Sí, el comportamiento es insano, porque limita muchas aplicaciones legítimas de índices de varias columnas, pero es lo que es … Hasta el momento, es un error que ha sido marcado con “no se corregirá” en MySQL bug-track …

¿Has probado esto?

 UNIQUE KEY `thekey` (`user`,`email`,`address`) 

Esto funciona para mysql versión 5.5.32

 ALTER TABLE `tablename` ADD UNIQUE (`column1` ,`column2`); 

Puede agregar índices únicos de varias columnas a través de phpMyAdmin . (Probé en la versión 4.0.4)

Navegue a la página de estructura para su tabla de destino. Agregue un índice único a una de las columnas. Expanda la lista de Índices en la parte inferior de la página de estructura para ver el índice único que acaba de agregar. Haga clic en el ícono editar, y en el siguiente diálogo puede agregar columnas adicionales a ese índice único.

MySql 5 o superior se comporta así (acabo de probar):

  • puede definir restricciones únicas que implican columnas que aceptan nulos. Supongamos que define una restricción única (A, B) donde A no es nulable pero B es
  • al evaluar tal restricción puede tener (A, nulo) tantas veces como desee (¡el mismo valor de A!)
  • solo puedes tener un par (A, no nulo B)

Ejemplo: PRODUCT_NAME, PRODUCT_VERSION ‘glass’, null ‘glass’, null ‘wine’, 1

Ahora, si intentas insertar (‘vino’ 1) otra vez, informará una violación de restricción Espero que esto ayude

Si quiere evitar duplicados en el futuro. Crea otra columna, di id2.

 UPDATE tablename SET id2 = id; 

Ahora agregue el único en dos columnas:

 alter table tablename add unique index(columnname, id2); 

Para agregar un índice único siguiente se requieren:

1) table_name
2) index_name
3) columnas en las que desea agregar índice

 ALTER TABLE `tablename` ADD UNIQUE index-name (`column1` ,`column2`,`column3`,...,`columnN`); 

En su caso, podemos crear un índice único de la siguiente manera:

 ALTER TABLE `votes`ADD UNIQUE ;(`user` ,`email`,`address`); 

Lo hago así:

 CREATE UNIQUE INDEX index_name ON TableName (Column1, Column2, Column3); 

Mi convención para un index_name único es TableName_Column1_Column2_Column3_uindex .