Lösung für das Ausgehen der Auto-Increment-ID (Primärschlüssel) von MySQL

Lösung für das Ausgehen der Auto-Increment-ID (Primärschlüssel) von MySQL

In MySQL werden viele Typen von Auto-Increment-IDs verwendet und für jede Auto-Increment-ID ist ein Anfangswert festgelegt. Im Allgemeinen beginnt der Anfangswert bei 0 und erhöht sich dann in einer bestimmten Schrittweite (normalerweise um 1). Im Allgemeinen verwenden wir int(11) als Autoinkrement-ID einer Datentabelle. In MySQL gibt es eine Obergrenze, solange die Bytelänge dieser Nummer definiert ist.

Was soll ich tun, wenn die Auto-Increment-ID (Primärschlüssel) von MySQL aufgebraucht ist?

Wenn wir int unsigned (int, 4 Bytes) verwenden, können wir die maximal aktuell deklarierte Auto-Increment-ID berechnen. Da hier int unsigned definiert ist, kann der Maximalwert 2 hoch 32 - 1 = 4294967295 erreichen.

Hier ist ein kleiner Trick. Beim Erstellen einer Tabelle können Sie den Anfangswert von AUTO_INCREMENT direkt als 4294967295 deklarieren.

Tabelle `test` erstellen (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 PRIMÄRSCHLÜSSEL (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=4294967295;

SQL-Insert-Anweisung

in „Test“-Werte einfügen (null);

Als ich versuchte, ein weiteres Datenelement einzufügen, erhielt ich das folgende abnormale Ergebnis.

[SQL] in „Test“-Werte einfügen (null);
[Err] 1062 - Doppelter Eintrag „4294967295“ für Schlüssel „PRIMARY“

Dies bedeutet, dass beim erneuten Einfügen der Daten die verwendete Auto-Increment-ID immer noch 4294967295 ist und ein Primärschlüsselkonfliktfehler gemeldet wird. Dies bedeutet, dass sich der ID-Wert nicht mehr ändert, nachdem er die Obergrenze erreicht hat. 4294967295, diese Zahl kann die meisten Szenarien bewältigen. Wenn Ihr Dienst häufig Daten einfügt und löscht, besteht immer noch das Risiko, dass die Zahl ausgeht. Es wird empfohlen, bigint unsigned zu verwenden, was eine große Zahl ist.

bigint unsigned ist ein Integer-Datenwert (alle Zahlen) im Bereich von -2^63 (-9223372036854775808) bis 2^63-1 (9223372036854775807), und seine Speichergröße beträgt 8 Bytes.

Es gibt jedoch eine andere Situation. Was passiert, wenn der Primärschlüssel beim Erstellen einer Tabelle nicht explizit deklariert wird?

In diesem Fall erstellt InnoDB automatisch eine unsichtbare 6-Byte-Zeilen-ID für Sie und verwaltet eine globale dictsys.row_id, sodass Tabellen ohne definierten Primärschlüssel die Zeilen-ID gemeinsam nutzen. Bei jedem Einfügen eines Datenelements wird die globale Zeilen-ID als Primärschlüssel-ID verwendet und dann wird die globale Zeilen-ID um 1 erhöht.

Die globale Zeilen-ID wird mit dem vorzeichenlosen Typ bigint implementiert, aber tatsächlich sind nur 6 Bytes für die Zeilen-ID reserviert. Bei diesem Entwurf tritt ein Problem auf: Wenn die globale Zeilen-ID weiter ansteigt, bis sie 2 hoch 48 - 1 erreicht, und dann um 1 ansteigt, sind die unteren 48 Bits der Zeilen-ID alle 0. Wenn daher eine neue Datenzeile eingefügt wird, ist die erhaltene Zeilen-ID 0 und es besteht die Möglichkeit eines Primärschlüsselkonflikts.

Um diese versteckte Gefahr zu vermeiden, muss jede Tabelle über einen Primärschlüssel verfügen.

Zusammenfassen

Nachdem die Auto-Increment-ID der Datenbanktabelle die Obergrenze erreicht hat, ändert sich ihr Wert bei erneuter Anwendung nicht mehr. Das weitere Einfügen von Daten führt zu einem Primärschlüsselkonfliktfehler. Versuchen Sie daher beim Entwerfen einer Datentabelle, basierend auf den Geschäftsanforderungen den geeigneten Feldtyp auszuwählen.

Oben finden Sie den detaillierten Inhalt der Lösung für das Problem, dass die Autoinkrement-ID (Primärschlüssel) von MySQL aufgebraucht ist. Weitere Informationen zur Autoinkrement-ID (Primärschlüssel) von MySQL finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • So ändern Sie den Startwert der MySQL-Auto-Increment-ID
  • So setzen Sie die MySQL-Auto-Increment-ID auf 0 zurück
  • Lösung für das Problem der Selbstinkrement-ID in der MySQL-Tabelle
  • Fehlerbehebung und Lösungen für das Problem der MySQL-Autoinkrement-ID-Übergröße
  • Was Sie über die automatische ID-Inkrementierung in MySQL wissen müssen
  • Beispiel für die Erschöpfung der MySQL-Auto-Increment-ID
  • Zusammenfassung einiger kleinerer Probleme mit der MySQL-Autoinkrement-ID
  • Was tun, wenn die selbstinkrementierende MySQL-ID ausgeht?

<<:  Verschiedene Implementierungsmethoden von Vue zum Ändern von übergeordneten Komponenteneigenschaften durch untergeordnete Komponenten

>>:  So erstellen Sie ein Tomcat-Image basierend auf Dockerfile

Artikel empfehlen

Detailliertes Beispiel für das Linux-Allround-Systemüberwachungstool dstat

Umfassendes Systemüberwachungstool dstat dstat is...

Verstehen Sie das elastische CSS3 FlexBox-Layout in 10 Minuten

Grundlegende Einführung Merkmale Flexbox ist ein ...

4 Funktionen, die durch das Transform-Attribut in CSS3 implementiert werden

In CSS3 können mit der Transformationsfunktion vi...

So kaufen Sie einen Server und richten ihn zunächst ein

Ich habe eine Weile nicht mit Servern gearbeitet....

TCP-Socket-SYN-Warteschlange und Accept-Warteschlangen-Unterschiedsanalyse

Zunächst müssen wir verstehen, dass ein TCP-Socke...

So implementieren Sie die Paging-Funktion des MyBatis-Interceptors

So implementieren Sie die Paging-Funktion des MyB...

So erstellen Sie ein neues Image basierend auf einem vorhandenen Image in Docker

Das Erstellen neuer Images aus vorhandenen Images...

Detaillierte Beispiele für Linux-Festplattengeräte- und LVM-Verwaltungsbefehle

Vorwort Im Linux-Betriebssystem sind Gerätedateie...

Einführung in den Swap-Speicher des Linux-Systems

Swap-Speicher ist heutzutage ein gängiger Aspekt ...

Detaillierte Erklärung zur Verwendung von MySQL Online DDL

Inhaltsverzeichnis Text LOCK-Parameter ALGORITHMU...