Forum: PC-Programmierung MYSQL Auto Inkrement weist Lücken auf


von Steffan S. (Gast)


Lesenswert?

Hallo :)

ich habe folgendes Problem:

ich habe eine Datenbank bei MySql erstellt und kopiere mit dem INSERT 
INTO Befehl eine Tabelle in eine andere (mit einem Befehl wird die 
gesamte Tabelle kopiert).
Ich kopiere eine Tabelle mit 2 oder mehr Zeilen (auto_increment gesetzt) 
stimmt die ID in der neuen Tabelle. Kopiere ich anschließend allerdings 
noch mal eine Tabelle (Anzahl der Zeilen egal) so wird bei der ID ein 
oder zweite Werte übersprungen.
Kopiere ich immer nur eine Tabelle mit einem Wert passt die ID.

Beispiel:

Tabelle1 mit 2 Zeilen wird in Tabelle2 kopiert.
in Tabelle2 sind nun 2 Zeilen vorhanden mit den IDs 1 und 2
Tabelle3 mit 1 Zeile wird nun in Tabelle2 kopiert
Jetzt ist die ID Reihenfolge: 1, 2, 4


Woran könnte das liegen?

von Dirk D. (dicky_d)


Lesenswert?

ist in den Quell-Tabellen die Spalte mit dem AI nicht vorhanden?

von Peter II (Gast)


Lesenswert?

kannst du zeigen das du genau machst?

Unabhängig davon kann man kaum davon ausgehen, das nie Lücken vorhanden 
sind. Sobald man mit Transaktionen arbeitet und ein Rollback kommt, 
gehen IDs verloren.

von Steffan S. (Gast)


Lesenswert?

Nach langer suche in englisch-sprachigen Foren bin ich nun zu einer 
Lösung und zu einem Ansatz gekommen der den Fehler erklärt:

Durch das INSERT INTO kommt es bei doppelten Datensätzen (z.B. 2x 
Produkt1) zu einem Fehler beim Insert. Bei einem Fehler wird der 
Autoinkrement dennoch durchgeführt. Ich weiß nicht ob diese Erklärung 
genauso stimmt, allerdings passt Sie perfekt zu meinem Fehlerbild.

Zur Lösung:

Lösung 1: Man soll irgendwie den autoinc lock mode umstellen können. Der 
steht seit Version 5.5 nämlich auf 1. In vorherigen Versionen immer auf 
0. Durch die änderung auf 0 wird kein Autoinkremnt durchgeführt wenn ein 
Fehlerhaftes Insert stattfindet.

Lösung 2: Setzt man vor dem kopieren der Tabelle den Autoinkrementwert 
mit ALTER TABLE AUTO_INCREMENT=1 auf 1 zurück, so wird die nicht auf 1 
gesetzt sondern auf die letzte ID des Primärschlüssels.

Ich habe mich für die Lösung 2 entschieden weil ich nicht wusste wie ich 
Lösung 1 durchführen sollte.

Danke dennoch für die Hilfe. Vielleicht kann meine Lösung jemandem 
helfen.
Falls jemand einen Fehler in meiner Erklärung findet bitte korrigiert 
mich, wie gesagt bin mir nicht ganz sicher.

LG

Steffan

von (prx) A. K. (prx)


Lesenswert?

Wenn das primäre Ziel der AUTO_INCREMENT Spezifikation darin besteht, 
auf einfache und schnelle Art eindeutige IDs zu erzeugen, dann sind 
Lücken tolerierbar.

Ich wäre auch nicht erstaunt, wenn sich der gleiche App-Code bei 
verschiedenen Engines unterschiedlich verhält.

Wenn man Anforderungen hat, die davon nicht einfach erfüllbar sind, dann 
sollte man evtl. einplanen, die IDs anders zu erzeugen. Und nicht auf 
Hacks setzen, die möglicherweise beim nächsten Upgrade platzen.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.