MySQL – nächster AutoIndex zurücksetzen/resetten bevor INSERT INTO

07. Dezember 2010  |  Kommentar schreiben   |  Tags: , , , ,



Bei Facebook teilen

Bestimmt kommt der Tag, wo Sie Massenimports mit MySQL vornehmen werden. Diese Imports können dazu führen, dass Sie große Mengen an Datensätzen per INSERT INTO einfügen. Für Tabellen mit einem klassischen ID Feld mit auto_increment kann das mittel- bis langfristig ein großes Problem werden, denn der maximale Wert dieser ID Spalte kann über kurz oder lang überschritten werden. Dann können Sie nicht mehr einfügen. Woran liegt das?

Problemstellung

Wenn Sie eine MySQL Tabelle mit einer ID Spalte anlegen, die im Normalfall den Attribut auto_increment hat, wird durch das MySQL Engine sichergestellt, dass beim Einfügen eine bereits benutzte ID nie wieder benutzt wird, sondern es wird immer die nächste freie direkt angenommen. Allerdings wenn Sie Datensätze löschen, wird die nächste freie ID weiterhin so generiert, als hätten Sie nichts gelöscht. Beispielsweise fügen Sie 200 Datensätze ein, beim INSERT INTO vom Datensatz 201 wird der nächste AutoIndex automatisch auf 202 gesetzt. Jetzt gehen Sie hin und löschen 100 Datensätze, so dass es nur 100 Datensätze in der Tabelle gibt. Wenn Sie nun versuchen einzufügen, so bekommt der Datensatz 101 die ID 202. MySQL reserviert die bereits vergebene IDs und vergibt diese nie wieder.

Wenn Sie tägilch per Import 1000 Datensätze löschen und dann wieder importieren, so bekommen Sie innerhalb von 30 Tagen eine ID von 30.000. Bald werden Sie auf BIGINT umstellen müssen, was nicht gerade prickelnd ist. Das Problem ist aber, dass die Programmierer fast immer diesen Aspekt vergessen und irgendwann funktioniert der INSERT INTO nicht mehr. Was kann man machen?

Lösung 1 – TRUNCATE TABLE

Angenommen Sie machen Ihren Import komplett in einer Tabelle, die nicht für weitere Zwecke benutzt wird. Dann können Sie die Tabelle komplett leer machen mittels folgender Abfrage:

TRUNCATE TABLE ´IhreTabelle´

Mit diesem Befehl wird der AutoIndex auf 1 gesetzt/resettet und Sie können ruhig alle aktuellen Datensätze importieren. Was tun aber wenn Sie weitere Daten in der Tabelle haben, die Sie gerne behalten möchten? Vor allem können Sie sich ja nicht leisten mit einmal komplett neue IDs der bestehenden Datensätzen zu vergeben, denn diese können sich auf Fremdschlüssel beziehen.

Lösung 2- Next AutoIndex zurücksetzen

Sie können MySQL dazu zwingen, den nächstmöglichen AutoIndex zu nehmen, der sich aus der Anzahl der Zeilen bzw. die bisher maximale sich in der Tabelle befindende ID bezieht. Dazu führen Sie die folgende MySQL Abfrage aus:

ALTER TABLE ´IhreTabelle´AUTO_INCREMENT=1

Und damit haben Sie gewonnen! Solche Programmierlösungen sind auch besonders wichtig für Fälle, wo Sie mehrere unterschiedliche Imports aus unterschiedlichen Quellen machen.

Teilen

Hinterlasse eine Antwort

Du musst angemeldet sein, um einen Kommentar abzugeben.