Cómo agregar clave única a la tabla existente (con filas no únicas)


Quiero agregar clave única compleja a la tabla existente. Clave contiene de 4 campos (user_id, game_id, date, time). Pero la tabla tiene filas no únicas. Entiendo que puedo eliminar todas las fechas duplicadas y después agregar clave compleja.

Tal vez exista otra solución sin buscar todos los datos duplicados. (como agregar único ignorar etc).

UPD Busqué, ¿cómo se puede eliminar filas mysql duplicados-creo que es una buena solución. ¿Eliminar duplicados usando solo una consulta MySQL?

Author: yAnTar, 2013-03-06

7 answers

Puedes hacer lo que yAnTar aconsejó

ALTER TABLE TABLE_NAME ADD Id INT IDENTITY(1,1) PRIMARY KEY

O

Puede agregar una restricción

ALTER TABLE TABLE_NAME ADD CONSTRAINT constr_ID UNIQUE (user_id, game_id, date, time)

Pero creo que para no perder sus datos existentes, puede agregar una columna de identidad y luego hacer una clave compuesta.

 91
Author: Igor Lozovsky,
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-06 19:17:11

ALTER TABLE 0_value_addition_setup ADD UNIQUE ( value_code )

 9
Author: radhason power,
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-10-04 10:19:37

Tuve que resolver un problema similar. Heredé una gran tabla de fuentes de MS Access con casi 15000 registros que no tenían una clave primaria, que tuve que normalizar y hacer compatible CakePHP. Una convención de CakePHP es que cada tabla tiene una clave primaria, que es la primera columna y que se llama 'id'. La siguiente declaración simple hizo el truco para mí bajo MySQL 5.5:

ALTER TABLE `database_name`.`table_name` 
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (`id`);

Esto agregó una nueva columna ' id ' de tipo entero delante de los datos existentes ("FIRST" palabra clave). La palabra clave AUTO_INCREMENT incrementa los ids empezando por 1. Ahora cada conjunto de datos tiene un id numérico único. (Sin la instrucción AUTO_INCREMENT todas las filas se rellenan con id = 0).

 8
Author: user3149374,
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-01-05 17:49:04

Estoy proporcionando mi solución con la suposición de su lógica de negocio. Basicall en mi diseño permitiré que la tabla almacene solo un registro para una combinación de usuario y juego. Así que voy a añadir una clave compuesta a la tabla.

PRIMARY KEY (`user_id`,`game_id`)
 3
Author: Slowcoder,
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-06 20:39:24

Cree un id de incremento automático o un id ÚNICO y agréguelo a la clave natural de la que está hablando con los 4 campos. esto hará que cada fila de la tabla única...

 2
Author: Hituptony,
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-06 18:43:04

Establecer la clave única múltiple en la tabla

ALTER TABLE table_name
ADD CONSTRAINT UC_table_name UNIQUE (field1,field2);
 0
Author: prakash 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
2018-06-01 07:16:02

Tenga cuidado de simplemente agregar una clave ÚNICA, ya que acepta más de un valor NULL.

 -1
Author: user2649201,
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-12-01 04:48:31