Tengo una tabla de base de datos MySQL con dos columnas que me interesan. Individualmente, cada uno puede tener duplicados, pero nunca deben tener un duplicado de AMBOS que tengan el mismo valor.
stone_id
puede tener duplicados siempre que cada upsharge
título sea diferente y al revés. Pero digamos, por ejemplo, stone_id
= 412 y upcharge_title
= "zafiro", esa combinación solo debería ocurrir una vez.
Esto esta bien:
stone_id = 412 upcharge_title = "sapphire"
stone_id = 412 upcharge_title = "ruby"
Esto NO está bien:
stone_id = 412 upcharge_title = "sapphire"
stone_id = 412 upcharge_title = "sapphire"
¿Existe alguna consulta que encuentre duplicados en ambos campos? Y si es posible, ¿hay alguna manera de configurar mi base de datos para que no permita eso?
Estoy usando MySQL versión 4.1.22
fuente
Encontré útil agregar un índice único usando un "ALTER IGNORE" que elimina los duplicados y refuerza los registros únicos que suenan como le gustaría hacer. Entonces la sintaxis sería:
Esto agrega efectivamente la restricción única, lo que significa que nunca tendrá registros duplicados y IGNORE elimina los duplicados existentes.
Puede leer más sobre eh ALTER IGNORE aquí: http://mediakey.dk/~cc/mysql-remove-duplicate-entries/
Actualización: @Inquisitive me informó que esto puede fallar en las versiones de MySql> 5.5:
Actualización:
ALTER IGNORE
eliminada en 5.7De los documentos
Uno de los desarrolladores de MySQL ofrece dos alternativas :
INSERT IGNORE
, por ejemplo:Pero dependiendo del tamaño de su mesa, esto puede no ser práctico
fuente
Puedes encontrar duplicados como este ...
fuente
Para encontrar los duplicados:
Para limitar y evitar esto en el futuro, cree una clave única compuesta en estos dos campos.
fuente
Por cierto, una restricción única compuesta sobre la mesa evitaría que esto ocurriera en primer lugar.
(Esto es T-SQL válido. No estoy seguro acerca de MySQL).
fuente
esta publicación SO me ayudó, pero yo también quería saber cómo eliminar y mantener una de las filas ... aquí hay una solución PHP para eliminar las filas duplicadas y mantener una (en mi caso, solo había 2 columnas y está en un función para borrar asociaciones de categorías duplicadas)
el (límite NUM_DUPES - 1) es lo que conserva la fila única ...
gracias a todos
fuente
ALTER IGNORE TABLE table ADD UNIQUE INDEX index_name(stone_id, charge_title)
eliminará filas duplicadas dejando solo un par único.