Mi sono recentemente trovato di fronte alla necessità di introdurre una nuova colonna all’interno di una tabella del mio database MariaDB, con l’obiettivo di definire un ordinamento statico per i contenuti presenti. La sfida principale risiedeva nel fatto di aggiornare una colonna di un database maniera progressiva già popolato .

Di fronte a questa situazione, si prospettavano principalmente due approcci: sviluppare uno script applicativo dedicato all’impostazione sequenziale del valore di ordinamento per ciascuna riga, oppure optare per una soluzione direttamente a livello di database. Ho quindi intrapreso la seconda strada, concentrandomi su come aggiornare progressivamente una colonna in un database MySQL (o MariaDB), elaborando uno script SQL efficiente da eseguire tramite una singola query. Dopo aver scrupolosamente creato lo script, ho proceduto a testarne la validità e l’efficacia direttamente sul database di sviluppo. Il risultato ottenuto si è rivelato estremamente interessante, dimostrando fin da subito la sua funzionalità.

Desidero condividere con voi la query SQL che ho utilizzato con successo nel mio ambiente MySQL:

SET @rownum = 0;

UPDATE tabella AS lp
JOIN (
SELECT idtabella, (@rownum := @rownum + 1) AS new_ordinamento
FROM tabella
ORDER BY idtabella
) AS ordered
ON lp.idtabella = ordered.idtabella
SET lp.ordinamento = ordered.new_ordinamento;

Analizziamo nel dettaglio il funzionamento di questa potente query per aggiornare progressivamente una colonna in un database MySQL:

  • SET @rownum = 0;: Questa riga di codice inizializza una variabile utente di MySQL chiamata @rownum assegnandole il valore iniziale di zero. Questa variabile fungerà da contatore progressivo durante l’elaborazione della query.
  • UPDATE tabella AS lp: Questa clausola avvia l’operazione di aggiornamento sulla tabella desiderata. Ho utilizzato l’alias lp per riferirmi alla tabella principale in modo più conciso all’interno della query.
  • JOIN (...) AS ordered ON lp.idtabella = ordered.idtabella: Questa è la parte cruciale che permette di collegare i dati esistenti con i numeri di ordinamento progressivi generati. Viene utilizzata una JOIN con una subquery (racchiusa tra parentesi e aliasata come ordered). La condizione di join lp.idtabella = ordered.idtabella assicura che ogni riga della tabella originale venga abbinata al numero di ordinamento corretto in base al suo idtabella.
  • SELECT idtabella, (@rownum := @rownum + 1) AS new_ordinamento FROM tabella ORDER BY idtabella: Questa subquery è responsabile della generazione dei numeri di ordinamento progressivi.
    • SELECT idtabella, ... FROM tabella: Seleziona la colonna idtabella dalla tabella.
    • (@rownum := @rownum + 1) AS new_ordinamento: Questa espressione incrementa la variabile utente @rownum di uno per ogni riga elaborata e assegna questo valore incrementato come new_ordinamento. L’operatore := è utilizzato per l’assegnazione all’interno della query.
    • ORDER BY idtabella: Questa clausola è fondamentale perché garantisce che i record vengano ordinati in base alla colonna idtabella prima che venga assegnato il numero progressivo. In questo modo, l’ordinamento risultante nella colonna ordinamento sarà basato sull’ordine dei valori di idtabella.
  • SET lp.ordinamento = ordered.new_ordinamento;: Infine, questa clausola esegue l’aggiornamento vero e proprio. Imposta il valore della colonna ordinamento (nella tabella originale, aliasata come lp) con il valore generato new_ordinamento dalla subquery ordinata.

In conclusione, questa tecnica si è dimostrata un modo efficiente e diretto per aggiornare progressivamente una colonna in un database MySQL o MariaDB, fornendo un controllo preciso sull’ordine dei dati senza la necessità di scrivere complessi script esterni.

Se ti è interessato questo argomento dove ti spiego come aggiornare una colonna di un database maniera progressiva leggi anche: https://www.salisnet.eu/2024/11/cambiare-la-password-root-di-mysql-pillole/