Tabela x zawierająca multum rekordów należących do różnych użytkowników. Kolumna ordering zawierająca numer porządkowy (indywidualny dla każdego usera).
Sytuacja A) User dodaje rekord wskazując pod jakim nr porządkowym ma się znaleźć w bazie.
Sytuacja B) User lub admin aktualizuje rekord zmieniając jego nr porządkowy i / lub user_id
Sytuacja C) User usuwa rekord powodując powstanie luki w numeracji
Przy dużej ilości rekordów nie możemy sobie pozwolić na aktualizację każdego numeru osobno, trzeba to robić globalnie.
Dodając rekord możemy wykonać zapytanie typu 'UPDATE x SET ordering = ordering + 1 WHERE ordering >= ''.$t_data['ordering'].''' AND user_id = ''.$user_id.'''; i po tym zapytaniu dodać nowy rekord. W ten sposób przesuwamy o jedno oczko wszystkie rekordy powyżej.
Usuwając rekord wykonujemy zapytanie 'UPDATE x SET ordering = ordering - 1 WHERE ordering >= ''.$t_data['ordering'].''' AND user_id = ''.$user_id.'''; Czyli zmniejszamy o jedno oczko powyżej powstałej luki.
Aktualizując rekord robi się już troszkę grubiej.
Jedno zapytanie doda 1 oczko do niektórych rekordów w przypadku gdy nr porządkowy zostaje zmniejszony
Drugie zapytanie odejmie 1 oczko od niektórych rekordów w przypadku gdy nr porządkowy zostaje zwiększony.
Schody zaczynają się wtedy kiedy administrator zmienia user id. Wówczas dzieje się to tak jakby z usera pierwszego rekord usuwano, a do usera drugiego dodawano.
Ogarnąłem to działa to nawet wydajnie, ale pytanie brzmi.
Czy istnieje jakiś wewnętrzny mechanim mysql pozwalający na błyskawiczną renumerację rekordów w danej tabeli w przypadku zmiany numeru itp.?