phpMyAdmin
 sql >> Datenbank >  >> Database Tools >> phpMyAdmin

Automatisches Inkrement überspringende Zahlen?

Das standardmäßige auto_increment-Verhalten in MySQL 5.1 und höher wird Auto-Increment-Werte „verlieren“, wenn INSERT fehlschlägt. Das heißt, es wird jedes Mal um 1 erhöht, aber eine Erhöhung nicht rückgängig gemacht, wenn das INSERT fehlschlägt. Es ist ungewöhnlich, ~750 Werte zu verlieren, aber nicht unmöglich (ich habe nach einer Site gesucht, die 1500 für jede erfolgreiche INSERT übersprungen hat).

Sie können innodb_autoinc_lock_mode=0 ändern um das Verhalten von MySQL 5.0 zu verwenden und in einigen Fällen den Verlust von Werten zu vermeiden. Siehe http://dev.mysql. com/doc/refman/5.1/en/innodb-auto-increment-handling.html für weitere Details.

Eine andere zu überprüfende Sache ist der Wert von auto_increment_increment Konfigurationsvariable. Es ist standardmäßig 1, aber Sie haben dies möglicherweise geändert. Auch hier ist es sehr ungewöhnlich, ihn auf etwas höher als 1 oder 2 zu setzen, aber möglich.

Ich stimme anderen Kommentatoren zu, autoinc-Spalten sollen eindeutig sein, aber nicht unbedingt aufeinander folgend. Sie sollten sich wahrscheinlich nicht so viele Gedanken darüber machen, es sei denn, Sie erhöhen den autoinc-Wert so schnell, dass Sie den Bereich eines INT verlassen könnten (das ist mir passiert).

Wie genau haben Sie es behoben, dass 1500 für immer eingefügt wurden?

Die Ursache für das Fehlschlagen von INSERT war, dass es eine andere Spalte mit einer UNIQUE-Einschränkung gab und INSERT versuchte, doppelte Werte in diese Spalte einzufügen. Lesen Sie die Handbuchseite, auf die ich verlinkt habe, um Einzelheiten darüber zu erfahren, warum dies wichtig ist.

Die Lösung bestand darin, zuerst ein SELECT durchzuführen, um das Vorhandensein des Werts zu überprüfen, bevor versucht wurde, ihn einzufügen. Dies widerspricht der allgemeinen Weisheit, die darin besteht, einfach INSERT zu versuchen und jede doppelte Schlüsselausnahme zu behandeln. Aber in diesem Fall führte der Nebeneffekt des fehlgeschlagenen INSERT dazu, dass ein Auto-Inc-Wert verloren ging. Wenn Sie zuerst ein SELECT durchführen, werden fast alle solchen Ausnahmen beseitigt.

Aber Sie auch müssen eine mögliche Ausnahme behandeln, auch wenn Sie zuerst SELECT ausführen. Sie haben immer noch eine Race-Condition.

Sie haben Recht! innodb_autoinc_lock_mode=0 funktionierte wie ein Zauber.

In Ihrem Fall würde ich gerne wissen, warum so viele Einsätze schlagen fehl. Ich vermute, dass Sie wie viele SQL-Entwickler den Erfolgsstatus nicht überprüfen, nachdem Sie Ihre INSERTs in Ihrem AJAX-Handler ausgeführt haben, sodass Sie nie wissen, dass so viele von ihnen fehlschlagen.

Sie scheitern wahrscheinlich immer noch, Sie verlieren nur nicht die automatisch eingefügten IDs als Nebeneffekt. Sie sollten wirklich diagnostizieren, warum so viele Fehler auftreten. Sie könnten entweder unvollständige Daten generieren oder viel mehr Transaktionen als nötig ausführen.