Celem AUTO_INCREMENT
jest tworzenie prostych i bezsensowne unikalne identyfikatory dla swoich wierszy. Jak tylko planujesz ponownie użyć tych identyfikatorów, nie są już one unikalne (przynajmniej w czasie), więc mam wrażenie, że nie używasz odpowiedniego narzędzia do pracy. Jeśli zdecydujesz się pozbyć AUTO_INCREMENT
, możesz zrobić wszystkie swoje wstawki z tym samym algorytmem.
Jak o kodzie SQL, ta kwerenda będzie pasował do istniejących wierszy z wierszy, które ma następnego ID:
SELECT a.foo_id, b.foo_id
FROM foo a
LEFT JOIN foo b ON a.foo_id=b.foo_id-1
np
1 NULL
4 NULL
10 NULL
12 NULL
17 NULL
19 20
20 NULL
24 25
25 26
26 27
27 NULL
więc łatwo odfiltrować wiersze i uzyskać pierwsza luka:
SELECT MIN(a.foo_id)+1 AS next_id
FROM foo a
LEFT JOIN foo b ON a.foo_id=b.foo_id-1
WHERE b.foo_id IS NULL
Weź to jako punkt wyjścia, ponieważ nadal wymaga pewnych modyfikacji:
- Należy wziąć pod uwagę przypadek, w którym najniższa dostępna liczba jest najniższą możliwą.
- Musisz zablokować stół, aby obsługiwać współbieżne wkładki.
- W moim komputerze jest powolny jak diabli z dużymi stołami.
Dlaczego chcesz to zrobić? Takie "dziury" są nienormalne w codziennej pracy z bazą danych i nie powinny stanowić problemu. Jeśli wynika to z błędnego pojęcia estetyki, przeciwstaw się temu. – Oded
Nie powinieneś. Auto_increment powinien po prostu wykonywać swoją pracę, a to oznacza, że można zrobić dziury. Jeśli zaczniesz się z tym bawić, napotkasz kłopoty później. Po prostu pozwól im być. – Nanne
Nie wspominając, że jeśli usunięty identyfikator jest nadal przywoływany gdzieś np. Poprzez zakładkowe łącze/niezaktualizowaną tabelę, dodanie nowego wiersza z tym identyfikatorem spowoduje niezamierzone problemy. Jak oznajmił Oded, Nanne, po prostu zostaw AI do wykonania swojej pracy. –