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’aliaslp
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 unaJOIN
con una subquery (racchiusa tra parentesi e aliasata comeordered
). La condizione di joinlp.idtabella = ordered.idtabella
assicura 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 colonnaidtabella
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 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 colonnaidtabella
prima che venga assegnato il numero progressivo. In questo modo, l’ordinamento risultante nella colonnaordinamento
sarà 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_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/