Trovare (e ripulire) i duplicati in mySQL e spostare tabelle

Scritto il 13 Maggio 2008
Nella categoria Produzioni Proprie
Tag: , ,

 

Oggi mi è capitato di voler spostare una tabella da un database ad un altro, entrambi sullo stesso server, perché una parte del progetto si è ingrandita e ora merita uno spazio tutto suo. Ovviamente la soluzione più semplice è esportare ed importare, ma oltre ad essere poco elegante, diventa lunga nel caso di una tabella con molti dati.

Database su foglio di calcolo

La soluzione più semplice è utilizzare la sintassi INSERT INTO, come nell’esempio

INSERT INTO `destinazione`.`dati`
SELECT *
FROM `origine`.`dati` ;

Questo copia la tabella dati dalla tabella originedestinazione. Volendo è possibile anche rinominare la tabella specificando due nomi diversi, oppure copiare solo alcune colonne della tabella. Molto importante, la tabella di destinazione deve essere già stata creata, con tutte le colonne e le chiavi necessarie.

Gestire invece i valori duplicati in una tabella è una cosa molto complessa, prima di tutto è necessario identificarli, la sintassi è questa:

SELECT nome, COUNT( nome ) AS totale FROM dati GROUP BY nome HAVING totale >1;

Questo identificherà tutti i nomi doppi nella dabella, solo quelli doppi, per vedere invece i valori distinti, cioè ogni singolo valore che appare, più semplicemente basta

SELECT nome, COUNT( nome ) AS totale FROM dati GROUP BY nome;

Se neanche interessa sapere quante volte appaiono, allora la query si riduce a

SELECT nome FROM dati GROUP BY nome;

Ora, eliminarli non è una cosa semplice, perché è difficile capire quali vanno tenuti e quali no, insomma non è un’azione da fare a cuor leggero e va sempre studiata. La soluzione più corretta è introdurre un vincolo di unicità sulla tabella, o come chiave o come valore unico.

ALTER INGORE TABLE `dati` ADD UNIQUE KEY ( `nome` , `numero` )

Questo comando di alterazione, aggiunge un vincolo di unicità della coppia nome,numero la clausola IGNORE permette di ignorare l’errore di duplicazione, senza la query non avrebbe successo in una tabella che non rispetta il vincolo. Non si hanno però certezze di quali altri dati vengano mantenuti.

Se l’obbiettivo è fare una pulizia assennata, il mio consiglio è procedere per passi, (prima di tutto lavorando su un backup e non dal vivo), quindi pulendo i valori doppi con la query di cui sopra, infine aggiornando i rimanenti dati dalla tabella originale.

Commenti

Scrivi un commento

Se vuoi.

Nome (obbligatorio)

E-mail (obbligatorio)

Sito web

Commenti