La ridondanza non ha sempre effetti negativi in informatica, in alcuni casi infatti essa viene utilizzata per aumentare l’affidabilità di un’applicazione tramite l’esecuzione di processi in parallelo, ma quando si parla di DBMS i record duplicati possono essere anche un problema, soprattutto quando ci si trova a gestire dei database di grandi dimensioni.
Trovare i record duplicati
Non è necessario farsi prendere dal panico davanti a fenomeni di ridondanza, pochi record duplicati non sono in grado di influire negativamente sulle prestazioni generali di un Database Manager; per avere un’idea corretta della presenza (o meno) di dati duplicati in una tabella MySQL è possibile utilizzare una semplice interrogazione, come nell’esempio seguente:
SELECT email, count(email) AS totale
FROM newsletter
GROUP BY email
HAVING totale > 1
ORDER BY totale;
HAVING è una clausola che viene applicata sui record della tabella risultante da una query GROUP BY, nel caso specifico la clausola permette di visualizzare i record per i quali il conteggio delle ricorrenze è superiore ad "1" e quindi corrispondente ad un record duplicato.
Cancellare i record duplicati
Esistono diversi modi per effettuare la pulizia automatica di una tabella dai risultati duplicati, uno dei più semplici ed efficaci consiste nel creare una nuova tabella, identica alla prima, con un indice univoco per il campo (o i campi) per i quali si vuole evitare che vi siano valori duplicati. Ecco le query SQL:
CREATE TABLE tmp LIKE mia_tabella;
ALTER TABLE tmp ADD UNIQUE (campo1);
fatto questo andremo a riversare nella nuova tabella i dati presenti nella tabella originale che si desidera "pulire", in questo modo:
INSERT INTO tmp SELECT * FROM mia_tabella;
Ora non resta che rinominare la tabella originale e quella temporanea, quest’ultima prenderà il nome di quella originale cha andrà a sostituire:
RENAME TABLE mia_tabella TO cancellami, tmp TO mia_tabella;
Alla fine, dopo gli opportuni controlli e verifiche, si potrà cancellare la tabella originale:
DROP TABLE cancellami;
Nota: nell’esempio abbiamo previsto un indice univoco composto da un solo campo, ma nulla vieta di creare un indice su più campi:
ALTER TABLE tmp ADD UNIQUE (campo1,campo2,...);