Ändern Sie den Spaltenwert der automatischen MySQL-Inkrement-ID

Nov 20 2020

Ich habe eine MySQL-Tabelle mit einer gpid AUTO_INCREMENT NOT NULL UNIQUESpalte.

Nach dem Ausfüllen dieser Tabelle (mit mehr als 50 Millionen Einträgen) habe ich festgestellt, dass MySQL die AUTO_INCREMENTSpalten immer noch inkrementiert , wenn die Transaktion aufgrund eines IntegrityError fehlschlägt, und das verständlicherweise.

Das Ergebnis sind Lücken in AUTO_INCREMENTSpalten mit gpidspringenden Werten (zum Beispiel von gpid == 3bis gpid == 5zwischen zwei aufeinanderfolgenden Zeilen). Während dies kein Problem für Maschinen ist, ist es eines für meine Mitarbeiter und mich. Der Zweck dieser Spalte bestand unter anderem darin, die genaue Anzahl der Zeilen in der Tabelle darzustellen.

Gibt es eine Möglichkeit, alle gpidSpaltenwerte in einen schönen Bereich (von 1 bis 53926669) zu ändern, wobei die Reihenfolge berücksichtigt wird, in der die Zeilen in die Tabelle eingefügt wurden, ohne die Tabelle löschen / neu füllen zu müssen? Das Nachfüllen würde lange dauern.

Vielen Dank.

Antworten

GMB Nov 20 2020 at 13:29

MySQL garantiert, genau wie andere Datenbanken, nicht das Fehlen von Lücken in der Spalte für die automatische Inkrementierung. Durch die Neunummerierung der Tabelle wird das Problem möglicherweise zu einem bestimmten Zeitpunkt behoben, es können jedoch (und höchstwahrscheinlich) in Zukunft Lücken auftreten.

Wenn Sie eine monotisch ansteigende Sequenz wünschen, ist die automatische Inkrementierung nicht das, was Sie benötigen. Stattdessen können Sie beispielsweise eine Ansicht erstellen und Folgendes verwenden row_number():

create view myview as
select t.*, row_number() over(order by gpid) as new_gpid
from mytable t