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@rownumassegnandole 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’aliaslpper 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 unaJOINcon una subquery (racchiusa tra parentesi e aliasata comeordered). La condizione di joinlp.idtabella = ordered.idtabellaassicura che ogni riga della tabella originale venga abbinata al numero di ordinamento corretto in base al suoidtabella.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 colonnaidtabelladalla tabella.(@rownum := @rownum + 1) AS new_ordinamento: Questa espressione incrementa la variabile utente@rownumdi uno per ogni riga elaborata e assegna questo valore incrementato comenew_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 colonnaidtabellaprima che venga assegnato il numero progressivo. In questo modo, l’ordinamento risultante nella colonnaordinamentosarà basato sull’ordine dei valori diidtabella.
SET lp.ordinamento = ordered.new_ordinamento;: Infine, questa clausola esegue l’aggiornamento vero e proprio. Imposta il valore della colonnaordinamento(nella tabella originale, aliasata comelp) con il valore generatonew_ordinamentodalla 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/
