2009-03-13 10 views
77

Tengo una tabla de base de datos MySQL con dos columnas que me interesan. Individualmente pueden tener duplicados, pero nunca deben tener un duplicado de AMBOS con el mismo valor.Cómo encontrar duplicados en 2 columnas, no 1

stone_id pueden tener duplicados, siempre y cuando para cada título upsharge es diferente, y en sentido inverso. Pero diga por ejemplo stone_id = 412 y upcharge_title = "zafiro" esa combinación solo debería ocurrir una vez.

Esto está bien:

stone_id = 412 upcharge_title = "sapphire" 
stone_id = 412 upcharge_title = "ruby" 

Esto no es aceptable:

stone_id = 412 upcharge_title = "sapphire" 
stone_id = 412 upcharge_title = "sapphire" 

¿Hay una consulta que va a encontrar duplicados en ambos campos? Y si es posible, ¿hay alguna manera de configurar mi base de datos para que no lo permita?

estoy usando la versión de MySQL 4.1.22

Respuesta

142

Es necesario configurar una clave compuesta entre los dos campos. Esto requerirá un stone_id y un upcharge_title únicos para cada fila.

En cuanto a la búsqueda de los duplicados existentes a probar esto:

select stone_id, 
     upcharge_title, 
     count(*) 
from  your_table 
group by stone_id, 
     upcharge_title 
having count(*) > 1 
+0

Gracias, eso a seleccionar. ¿Podrías ser tan amable de decirme cómo eliminar duplicados (pero deja 1 copia por supuesto) GRACIAS !! –

+1

Una forma sería capturar todos los datos distintos y recrear la tabla. –

+1

@John Isaacks: si no hay otros campos con los que pueda distinguirlos (es decir, todos los campos son duplicados), tendrá que eliminar ambas filas y volver a crear una. Una forma sería copiar duplicados en una copia de la tabla, eliminarlos del original y reinsertar distintas filas de la copia. –

4

Para encontrar los duplicados:

select stone_id, upcharge_title from tablename group by stone_id, upcharge_title having count(*)>1 

para limitar para evitar esto en el futuro, crear una clave única compuesta en estos dos campos .

+1

Muchas gracias, ¿pueden decirme cómo eliminar todos menos uno de los duplicados? ¿Y cómo configuro una clave compisite en phpmyadmin? ¡¡¡GRACIAS!!! –

3

Puede encontrar duplicados como esto ..

Select 
    stone_id, upcharge_title, count(*) 
from 
    particulartable 
group by 
    stone_id, upcharge_title 
having 
    count(*) > 1 
3

Por cierto, una restricción única compuesta sobre la mesa sería evitar que esto ocurra en el primer lugar.

ALTER TABLE table 
    ADD UNIQUE(stone_id, charge_title) 

(Esto es T-SQL válida. No estoy seguro de MySQL.)

+0

Creo que funciona, pero no me deja hacerlo hasta que retire los duplicados primero. Gracias. –

0

este SO correos me ayudaron, pero yo también quería saber cómo eliminar y mantener una de las filas ... aquí está una solución PHP para eliminar las filas duplicadas y tener una (en mi caso sólo había 2 columnas y se encuentra en una función para borrar asociaciones de categoría duplicados)

$dupes = $db->query('select *, count(*) as NUM_DUPES from PRODUCT_CATEGORY_PRODUCT group by fkPRODUCT_CATEGORY_ID, fkPRODUCT_ID having count(*) > 1'); 
if (!is_array($dupes)) 
    return true; 
foreach ($dupes as $dupe) { 
    $db->query('delete from PRODUCT_CATEGORY_PRODUCT where fkPRODUCT_ID = ' . $dupe['fkPRODUCT_ID'] . ' and fkPRODUCT_CATEGORY_ID = ' . $dupe['fkPRODUCT_CATEGORY_ID'] . ' limit ' . ($dupe['NUM_DUPES'] - 1); 
} 

los (NUM_DUPES límite - 1) es lo que preserva la fila única ...

gracias

+3

tabla 'ALTER IGNORE TABLE ADD UNIQUE INDEX index_name (stone_id, charge_title) 'eliminará las filas duplicadas dejando solo un par único. –

26

Me pareció útil agregar un índice único utilizando un "ALTER IGNORE" que elimina los duplicados y aplica los registros únicos que suena como lo que le gustaría hacer. Por lo que la sintaxis sería:

ALTER IGNORE TABLE `table` ADD UNIQUE INDEX(`id`, `another_id`, `one_more_id`); 

Esto se suma de manera efectiva la restricción única que significa que nunca tendrá registros duplicados y el IGNORE elimina los duplicados existentes.

Puede leer más sobre eh ALTER IGNORE aquí: http://mediakey.dk/~cc/mysql-remove-duplicate-entries/

Actualización: Me fue informado por @Inquisitive que esto puede fallar en versiones de MySQL 5.5:>

Se produce un error en MySQL> 5.5 y en la tabla InnoDB, y en Percona debido a su función de creación rápida de índices InnoDB [http://bugs.mysql.com/bug.php?id=40344]. En este caso primera carrera set session old_alter_table=1 y luego el comando anterior no tendrán ningún problema

+0

+1 Solo 3 años tarde ... pero sigue siendo información útil. Gracias. –

+1

Cierto, pero al menos para la próxima vez que lo sepa. Tuve el mismo problema y pensé que era bueno compartirlo con otros. – SeanDowney

+0

Solo bromeaba sobre que era 3 años de retraso. Realmente me alegro de que hayas compartido. De ahí el plus 1. –

Cuestiones relacionadas