2011-08-29 15 views
5

Ho delle righe duplicate nelle tabelle.Come eliminare le righe duplicate e aggiornare la tabella

Ho due tabella che sono collegati da una chiave esterna

regions (id) 
orders (region_id) 

Le regioni hanno duplicato i nomi. Voglio eliminare queste righe duplicate e aggiornare la tabella degli ordini che duplicata chiave esterna sarà ora impostata per lasciare solo il nome esistente nella tabella delle regioni.

Esempio:

regions table: 

id name 
1 | test 
2 | test 
3 | foo 

orders table: 

id region_id 
6 | 1 
7 | 2 
9 | 3 

voglio

orders table: 

id region_id 
6 | 1 
7 | 1 
9 | 3 

regions table: 

id name 
1 | test 
3 | foo 

posso ottenere file duplicati con questo SQL:

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

Come posso collegare questo selezionare con tavolo ordine ed eliminare duplicati righe e aggiornare la tabella?

+0

Qual è la logica per quale record salvare dei duplicati? Presumo il primo (cioè la chiave primaria più bassa). Hai accesso a un'altra tecnologia. Probabilmente è più difficile farlo direttamente con MySQL. –

+1

Lukas non è solo eliminare le righe. Devo aggiornare le chiavi esterne! – senzacionale

+0

Mi dispiace, hai ragione ... –

risposta

5

per aggiornare la tabella degli ordini, qualcosa di simile:

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 
     ) 

Dopo di che, è possibile eliminare le righe duplicate con:

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

Il doppio sottoquery è necessario per evitare l'errore di MySQL ERROR 1093 (HY000) at line 36: You can't specify target table 'regions' for update in FROM clause.

+0

@senzacionale: Strano, funziona sulla mia installazione MySQL – Andomar

+0

per aiuto. Non so che hai bisogno di sdoppiare sottoquery per questo. – senzacionale

Problemi correlati