2011-08-29 20 views
5

Tengo filas duplicadas en las tablas.Cómo eliminar filas duplicadas y actualizar la tabla

que tienen dos mesas que están conectados por una clave externa

regions (id) 
orders (region_id) 

Las regiones han duplicado nombres. Quiero eliminar estas filas duplicadas y actualizar la tabla de pedidos, ya que la clave externa duplicada ahora se configurará con el nombre existente izquierdo en la tabla de regiones.

Ejemplo:

regions table: 

id name 
1 | test 
2 | test 
3 | foo 

orders table: 

id region_id 
6 | 1 
7 | 2 
9 | 3 

Quiero

orders table: 

id region_id 
6 | 1 
7 | 1 
9 | 3 

regions table: 

id name 
1 | test 
3 | foo 

puedo conseguir filas duplicadas con este SQL:

SELECT name, count(id) as cnt FROM regions 
GROUP BY name HAVING cnt > 1 

¿Cómo puedo conectar este selecto con la tabla de orden y borrar duplicados filas y actualizar la tabla?

+0

¿Cuál es la lógica para qué registro guardar de los duplicados? Supongo que el primero (es decir, la clave primaria más baja). ¿Tiene acceso a otra tecnología? Probablemente sea más difícil hacerlo con MySQL directamente. –

+1

Lukas no es solo eliminar filas. Necesito actualizar claves extranjeras! – senzacionale

+0

Lo siento, tienes razón ... –

Respuesta

5

Para actualizar la tabla de pedidos, algo así como:

update orders 
join regions r1 
on  r1.id = orders.region_id 
set  orders.region_id = 
     (
     select min(r2.id) 
     from regions r2 
     where r2.name = r1.name 
     ) 

Después de eso, puede eliminar las filas duplicadas con:

delete regions 
from regions 
where id not in 
     (
     select id 
     from (
       select min(id) as id 
       from regions 
       group by 
        name 
       ) as SubqueryAlias 
     ) 

Se requiere el doble subconsulta para evitar el error de MySQL ERROR 1093 (HY000) at line 36: You can't specify target table 'regions' for update in FROM clause.

+0

@senzacionale: Extraño, funciona en mi instalación de MySQL – Andomar

+0

thx para obtener ayuda. No sabía que necesita una doble subconsulta para esto. – senzacionale

Cuestiones relacionadas