Výchozí chování auto_increment v MySQL 5.1 a novějších „ztratí“ hodnoty automatického přírůstku, pokud INSERT selže. To znamená, že se pokaždé zvýší o 1, ale nezruší přírůstek, pokud INSERT selže. Je neobvyklé ztratit ~750 hodnot, ale není to nemožné (konzultoval jsem web, který přeskočil 1500 za každý úspěšný INSERT).
Můžete změnit innodb_autoinc_lock_mode=0
používat chování MySQL 5.0 a vyhnout se ztrátě hodnot v některých případech. Viz http://dev.mysql. com/doc/refman/5.1/en/innodb-auto-increment-handling.html
pro více podrobností.
Další věc, kterou je třeba zkontrolovat, je hodnota auto_increment_increment
konfigurační proměnná. Ve výchozím nastavení je 1, ale možná jste to změnili. Opět je velmi neobvyklé nastavit ji na něco vyššího než 1 nebo 2, ale je to možné.
Souhlasím s ostatními komentujícími, sloupce autoinc mají být jedinečné, ale ne nutně po sobě jdoucí. Pravděpodobně byste si s tím neměli dělat tolik starostí, pokud neposouváte hodnotu autoinc tak rychle, že byste mohli překročit rozsah INT (to se stalo mně).
Jak přesně jste to opravili, že přeskočí 1500 za vložení?
Příčinou selhání INSERTu bylo, že existoval další sloupec s omezením UNIQUE a INSERT se pokoušel do tohoto sloupce vložit duplicitní hodnoty. Přečtěte si manuálovou stránku, na kterou jsem odkazoval, kde najdete podrobnosti o tom, proč na tom záleží.
Oprava spočívala v provedení SELECT nejprve ke kontrole existence hodnoty před pokusem o její INSERT. To je v rozporu s běžnou moudrostí, kterou je prostě zkusit INSERT a zpracovat jakoukoli výjimku duplicitního klíče. V tomto případě však vedlejší účinek neúspěšného INSERT způsobil ztrátu hodnoty automatického vkládání. Provedení SELECT nejprve odstranilo téměř všechny takové výjimky.
Ale také musí zpracovat možnou výjimku, i když nejprve VYBERTE. Stále máte rasovou podmínku.
Máš pravdu! innodb_autoinc_lock_mode=0 fungovalo jako kouzlo.
Ve vašem případě bych chtěl vědět proč tolik vložek selhává. Mám podezření, že stejně jako mnoho vývojářů SQL nekontrolujete stav úspěchu poté, co provedete INSERT ve vašem obslužném programu AJAX, takže nikdy nevíte, že tolik z nich selhává.
Pravděpodobně stále selhávají, jen jako vedlejší efekt nepřicházíte o auto-inc ID. Měli byste skutečně diagnostikovat, proč dochází k tolika selháním. Můžete buď generovat neúplná data, nebo provádět mnohem více transakcí, než je nutné.