Come eliminare i duplicati in una tabella MySQL

Quando si lavora con un database, può capitare che una tabella contenga duplicati, ovvero righe con gli stessi valori in una o più colonne.

Programmazione MySQL
Programmazione MySQL

Eliminare i duplicati è importante per mantenere l’integrità dei dati e ottimizzare le query. Per farlo, è possibile utilizzare la clausola DISTINCT per ottenere solo i valori unici o la clausola GROUP BY per raggruppare le righe con gli stessi valori. Tuttavia, se si desidera eliminare fisicamente i duplicati dalla tabella, è necessario utilizzare una query di eliminazione.

Query MySQL per eliminare i duplicati. Ecco un esempio di query MySQL per eliminare i duplicati da una tabella chiamata nomi basata sulla colonna nome:

DELETE FROM nomi
WHERE id NOT IN (
  SELECT MIN(id)
  FROM nomi
  GROUP BY nome
);

Questa query elimina tutte le righe dalla tabella nomi in cui l’ID non corrisponde all’ID minimo all’interno di ogni gruppo di righe con lo stesso valore nella colonna nome. In altre parole, mantiene solo una riga per ogni valore unico nella colonna nome e elimina tutte le altre.

Assicurati di adattare questa query al nome della tua tabella e alla colonna su cui desideri eliminare i duplicati. Inoltre, è sempre consigliabile eseguire un backup dei dati prima di eseguire una query di eliminazione per evitare la perdita accidentale di informazioni.

Pubblicato in

Se vuoi rimanere aggiornato su Come eliminare i duplicati in una tabella MySQL iscriviti alla nostra newsletter settimanale

Informazioni su Anna Bruno 2353 Articoli
Anna Bruno è giornalista professionista con oltre venticinque anni di esperienza nel settore della comunicazione digitale, dell’innovazione e del giornalismo tech. Ha collaborato con quotidiani e magazine seguendo l’evoluzione di internet, dei media e delle tecnologie emergenti. Direttrice responsabile di FullPress.it e cofondatrice di FullPress Agency, è autrice dei libri Digital Travel e Digital Food (Flaccovio Editore), e lavora come consulente e docente nei settori del marketing digitale, del business online e della trasformazione digitale per PMI e professionisti.

2 Commenti

  1. Grazie per l’esempio ma….
    Mettiamo di avere una tabella senza una primary key, io riesco a trovare i record duplicati con il comando:
    SELECT id, name FROM test GROUP BY id, name HAVING COUNT(id) > 1 AND COUNT(crewname) > 1
    ora pero come faccio a cancellare il doppione?
    Fino ad ora ho usato il sistema di copiare record per record dalla tabella in questione in una tabella scratch, verificando record per record che non sia già inserito, e poi trasferendo la tabella scratch su quella di lavoro troncata prima del trasferimento. Però è una procedura lunghetta quando i record sono svariate centinaia di migliaia e l’operazione va eseguita ad ogni inserimento di nuovi dati.

    • Ciao!
      Il metodo che stai usando funziona, ma hai ragione: quando i record diventano centinaia di migliaia la procedura con la tabella “scratch” diventa molto pesante.

      In questi casi la soluzione più semplice ed efficace è aggiungere una chiave tecnica (AUTO_INCREMENT), anche se la tabella non ha una primary key “logica”. Una volta che ogni riga ha un identificatore univoco, puoi eliminare i duplicati mantenendo solo una riga per ogni combinazione di valori.

      Ad esempio:

      ALTER TABLE test
      ADD COLUMN pk BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY;

      Dopo aver aggiunto questa chiave unica, puoi cancellare i doppioni così:

      DELETE t
      FROM test AS t
      JOIN (
      SELECT MIN(pk) AS pk_keep, id, name, crewname
      FROM test
      GROUP BY id, name, crewname
      HAVING COUNT(*) > 1
      ) AS d
      ON t.id = d.id
      AND t.name = d.name
      AND t.crewname = d.crewname
      AND t.pk <> d.pk_keep;

      La query mantiene solo una riga per gruppo (quella con pk più basso) ed elimina le altre.

      Se invece vuoi evitare proprio che i duplicati vengano reinseriti a ogni aggiornamento, dopo la pulizia puoi aggiungere una chiave univoca:

      ALTER TABLE test
      ADD UNIQUE KEY uniq_values (id, name, crewname);

      In questo modo sarà direttamente MySQL a impedire l’inserimento dei doppioni e non dovrai più fare operazioni di deduplica manuale.

      Spero ti sia utile!
      Se vuoi, puoi incollare qui la struttura della tua tabella e vediamo insieme la query più adatta.

Lascia un commento

L'indirizzo email non sarà pubblicato.


*