Поведението на auto_increment по подразбиране в MySQL 5.1 и по-нови версии ще "загуби" стойности за автоматично увеличение, ако INSERT не успее. Тоест, той се увеличава с 1 всеки път, но не отменя увеличение, ако INSERT не успее. Необичайно е загубата на ~750 стойности, но не и невъзможно (консултирах се за сайт, който пропускаше 1500 за всяко INSERT, което успя).
Можете да промените innodb_autoinc_lock_mode=0
да използвате поведението на MySQL 5.0 и да избегнете загуба на стойности в някои случаи. Вижте http://dev.mysql. com/doc/refman/5.1/en/innodb-auto-increment-handling.html
за повече подробности.
Друго нещо, което трябва да проверите, е стойността на auto_increment_increment
конфигурационна променлива. По подразбиране е 1, но може да сте променили това. Отново, много рядко е да се зададе на нещо по-високо от 1 или 2, но е възможно.
Съгласен съм с други коментиращи, autoinc колоните са предназначени да бъдат уникални, но не непременно последователни. Вероятно не трябва да се притеснявате толкова много, освен ако не увеличавате стойността на autoinc толкова бързо, че бихте могли да избягате от обхвата на INT (това ми се случи).
Как точно го оправихте, като пропуснете 1500 за винаги вмъкване?
Причината за неуспеха на INSERT беше, че имаше друга колона с ограничение UNIQUE върху нея и INSERT се опитваше да вмъкне дублиращи се стойности в тази колона. Прочетете страницата с ръководството, към която дадох връзка, за подробности защо това има значение.
Поправката беше първо да се направи SELECT, за да се провери съществуването на стойността, преди да се опита да я INSERT. Това противоречи на общоприетото мнение, което е просто да опитате INSERT и да обработвате всяко изключение с дублиран ключ. Но в този случай страничният ефект от неуспешния INSERT доведе до загуба на стойност за автоматично включване. Извършването на SELECT първо елиминира почти всички подобни изключения.
Но вие също трябва да обработите възможно изключение, дори ако първо ИЗБЕРЕТЕ. Все още имате състезателно състояние.
Прав си! innodb_autoinc_lock_mode=0 работи като чар.
Във вашия случай бих искал да знам защо толкова много вложки се провалят. Подозирам, че подобно на много разработчици на SQL, вие не проверявате състоянието на успех, след като направите своите INSERT във вашия AJAX манипулатор, така че никога не знаете, че толкова много от тях се провалят.
Вероятно все още се провалят, просто не губите идентификационните номера на auto-inc като страничен ефект. Трябва наистина да диагностицирате защо възникват толкова много неуспехи. Може или генерирате непълни данни, или изпълнявате много повече транзакции, отколкото е необходимо.