¿Cómo puedo especificar una restricción única para varias columnas en MySQL?


Tengo una tabla:

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

Ahora quiero hacer que las columnas user, email, address sean únicas (juntas).

¿Cómo hago esto en MySQL?

  • Por supuesto, el ejemplo es justo... ejemplo. Así que por favor no te preocupes por la semántica.
Author: New Alexandria, 2009-03-11

11 answers

ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);
 1233
Author: jonstjohn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-04 11:46:23

Tengo una tabla 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 CLAVE ÚNICA funciona como se esperaba, permite múltiples filas nulas 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 con suerte se mantendrá de esa manera.

 194
Author: Frodik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-24 18:44:17

Los índices únicos de varias columnas no funcionan en MySQL si tiene un valor NULL en row, ya que MySQL trata a NULL como un valor único y al menos actualmente no tiene lógica para evitarlo en índices de varias columnas. Sí, el comportamiento es una locura, 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 solucionará" en la pista de errores de MySQL...

 43
Author: niksoft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-07 21:21:31

¿has probado esto ?

UNIQUE KEY `thekey` (`user`,`email`,`address`)
 22
Author: Erick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-11 19:14:24

Esto funciona para mysql versión 5.5.32

ALTER TABLE  `tablename` ADD UNIQUE (`column1` ,`column2`);
 11
Author: rizon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-05 08:55:56

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

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

 6
Author: Vince K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-20 00:40:34

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

  • puede definir restricciones únicas que involucren columnas nullables. Digamos que define una restricción única (A, B) donde A no es nullable pero B es
  • al evaluar tal restricción, puede tener (A, null) tantas veces como desee (¡el mismo valor!)
  • solo puedes tener un par (A, no null B)

Ejemplo: PRODUCT_NAME, PRODUCT_VERSION 'cristal', null 'cristal', null 'vino', 1

Ahora si intentas insert ('wine' 1) nuevamente reportará una violación de restricción Espero que esto ayude

 4
Author: Cristian Botiza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-03 12:56:47

Si desea evitar duplicados en el futuro. Crear otra columna diga id2.

UPDATE tablename SET id2 = id;

Ahora agregue el único en dos columnas:

alter table tablename add unique index(columnname, id2);
 1
Author: kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-09 23:01:40

Para agregar un índice único se requiere lo siguiente:

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

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 <votesuniqueindex>;(`user` ,`email`,`address`);
 1
Author: sandeep vanama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-22 14:07:03

Lo hago así:

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

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

 1
Author: LXXIII,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-27 21:20:18

Si está creando una tabla en mysql, use lo siguiente:

create table package_template_mapping (
mapping_id  int(10) not null auto_increment  ,
template_id int(10) NOT NULL ,
package_id  int(10) NOT NULL ,
remark      varchar(100),
primary key (mapping_id) ,
UNIQUE KEY template_fun_id (template_id , package_id)
);
 0
Author: Devendra Singraul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-09 05:50:17