Domyślne zachowanie auto_increment w MySQL 5.1 i późniejszych spowoduje "utracenie" wartości auto-inkrementacji, jeśli INSERT nie powiedzie się. Oznacza to, że za każdym razem zwiększa się o 1, ale nie cofa przyrostu, jeśli WSTAWIANIE nie powiedzie się. Utrata ~750 wartości jest rzadkością, ale nie jest to niemożliwe (skonsultowałem się z witryną, która pomijała 1500 za każdą udaną WSTAWKĘ).
Możesz zmienić innodb_autoinc_lock_mode=0
używać zachowania MySQL 5.0 i w niektórych przypadkach uniknąć utraty wartości. Zobacz http://dev.mysql. com/doc/refman/5.1/en/innodb-auto-increment-handling.html
po więcej szczegółów.
Kolejną rzeczą do sprawdzenia jest wartość auto_increment_increment
zmienna konfiguracyjna. Domyślnie jest to 1, ale mogłeś to zmienić. Ponownie, bardzo rzadko ustawia się go na wartość wyższą niż 1 lub 2, ale jest to możliwe.
Zgadzam się z innymi komentatorami, kolumny autoinc mają być unikalne, ale niekoniecznie następujące po sobie. Prawdopodobnie nie powinieneś się tym tak bardzo przejmować, chyba że zwiększasz wartość autoinc tak szybko, że możesz wykroczyć poza zakres INT (to mi się przydarzyło).
Jak dokładnie naprawiłeś to, pomijając 1500 na zawsze wstawkę?
Przyczyną niepowodzenia INSERT było to, że istniała inna kolumna z ograniczeniem UNIQUE, a funkcja INSERT próbowała wstawić zduplikowane wartości do tej kolumny. Przeczytaj stronę podręcznika, do której się połączyłem, aby dowiedzieć się, dlaczego ma to znaczenie.
Poprawka polegała na wykonaniu najpierw SELECT, aby sprawdzić istnienie wartości przed próbą jej INSERT. Jest to sprzeczne z powszechnym przekonaniem, że wystarczy spróbować WSTAWIĆ i obsłużyć każdy wyjątek zduplikowanego klucza. Ale w tym przypadku efekt uboczny nieudanej operacji INSERT spowodował utratę wartości auto-inc. Wykonanie SELECT najpierw wyeliminowało prawie wszystkie takie wyjątki.
Ale ty również musisz obsłużyć możliwy wyjątek, nawet jeśli najpierw wybierzesz opcję SELECT. Nadal masz warunki wyścigowe.
Masz rację! innodb_autoinc_lock_mode=0 działał jak urok.
W Twoim przypadku chciałbym wiedzieć dlaczego tak wiele wkładek zawodzi. Podejrzewam, że podobnie jak wielu programistów SQL, nie sprawdzasz statusu sukcesu po wykonaniu INSERTów w programie obsługi AJAX, więc nigdy nie wiesz, że tak wielu z nich zawodzi.
Prawdopodobnie nadal zawodzą, po prostu nie tracisz identyfikatora auto-inc jako efekt uboczny. Naprawdę powinieneś zdiagnozować, dlaczego zdarza się tak wiele niepowodzeń. Możesz albo generować niekompletne dane, albo przeprowadzać o wiele więcej transakcji niż to konieczne.