MySQL: haga que un campo existente sea único

155

Tengo una tabla ya existente con un campo que debería ser único pero no lo es. Solo sé esto porque se hizo una entrada en la tabla que tenía el mismo valor que otra entrada ya existente, y esto causó problemas.

¿Cómo hago que este campo solo acepte valores únicos?

Lothar
fuente

Respuestas:

293
ALTER IGNORE TABLE mytbl ADD UNIQUE (columnName);

Para MySQL 5.7.4 o posterior:

ALTER TABLE mytbl ADD UNIQUE (columnName);

A partir de MySQL 5.7.4, la cláusula IGNORE para ALTER TABLE se elimina y su uso produce un error.

Por lo tanto, asegúrese de eliminar primero las entradas duplicadas ya que la palabra clave IGNORE ya no es compatible.

Referencia

WuHoUnited
fuente
62
If IGNORE is specified, only the first row is used of rows with duplicates on a unique key, The other conflicting rows are deleted. Documentos de
The Scrum Meister
1
¿Hay alguna manera de decirle que elimine filas según un determinado criterio? ¿O necesitaría hacer un preprocesamiento antes ALTERde realizar esto?
corsiKa
77
ALTER IGNOREtodavía puede dar un error duplicado en la versión MySQL> 5.5 y en InnoDB por razones de seguridad de sus datos. Si está seguro de que mantener la primera de las filas duplicadas es lo correcto, intente set session old_alter_table=1. No te olvides de ponerlo de nuevo. mysqlolyk.wordpress.com/2012/02/18/…
michaelliu
2
Para cualquiera que se encuentre con esto usando 5.6.7 o superior, IGNORE ya no es compatible. moredocs Supongo que la forma de hacerlo ahora es asegurarte de que no tienes duplicados primero, ¿no?
William T. Mallard
1
Asegúrese de hacer una copia de seguridad de la tabla antes de ejecutar esta consulta. Eliminará todas las filas excepto la primera si el nombre de la columna tiene los mismos valores o está vacío.
steady_daddy
34

Simplemente escriba esta consulta en su db phpmyadmin.

ALTER TABLE TableName ADD UNIQUE (FieldName)

P.ej: ALTER TABLE user ADD UNIQUE (email)

Rizwan Shamsher Kaim Khani
fuente
16

Si también desea nombrar la restricción, use esto:

ALTER TABLE myTable
  ADD CONSTRAINT constraintName 
    UNIQUE (columnName);
ypercubeᵀᴹ
fuente
7

CREATE UNIQUE INDEX foo ON table_name (field_name)

Debe eliminar los valores duplicados en esa columna antes de ejecutar ese sql. Cualquier valor duplicado existente en esa columna lo llevará al error mysql 1062

Zulan
fuente
4

La forma más fácil y rápida sería con la tabla de estructura phpmyadmin.

¡USE EL PANEL DE ADMINISTRACIÓN DE PHPMYADMIN!

Ahí está en ruso pero en inglés la versión debería ser la misma. Simplemente haga clic en el botón Único. También desde allí puedes hacer tus columnas PRIMARY o DELETE.

MKA
fuente
2
ALTER IGNORE TABLE mytbl ADD UNIQUE (columnName);

es la respuesta correcta

la parte insertada

INSERT IGNORE INTO mytable ....
usuario3772326
fuente
1

Este código es para resolver nuestro problema al establecer una clave única para la tabla existente

alter ignore table ioni_groups add unique (group_name);
KARTHIKEYAN.A
fuente
Pero elimina todos los duplicados, incluidos los que están fuera de las columnas
Biasi Wiga