Che ne dici semplicemente di usare un integer
colonna che definisce l'ordine? Per impostazione predefinita assegni i numeri * 1000, come 1000, 2000, 3000 .... e se sposti 3000 tra 1000 e 2000 lo cambi in 1500. Quindi nella maggior parte dei casi non è necessario aggiornare gli altri numeri. Uso questo approccio e funziona bene. Puoi anche usare double
ma poi non hai il controllo sulla precisione e sugli errori di arrotondamento, quindi piuttosto non usarlo.
Quindi l'algoritmo sarebbe simile a :supponiamo di spostare B nella posizione dopo A. Per prima cosa esegui select per vedere l'ordine del record accanto ad A. Se è almeno +2 superiore all'ordine di A, devi semplicemente impostare l'ordine di B per adattarsi in mezzo. Ma se è solo +1 più alto (non c'è spazio dopo A), selezioni i record confinanti di B per vedere quanto spazio c'è su questo lato, dividi per 2 e quindi aggiungi questo valore all'ordine di tutti i record tra A e B. Questo è tutto!
(Nota che dovresti usare transazione/blocco per qualsiasi algoritmo che contiene più di una singola query, quindi questo vale anche per questo caso. Il modo più semplice è usare la transazione InnoDB.)