Was passiert, wenn DB-Engine aus Zahlen läuft für Primärschlüssel zu benutzen?

StackOverflow https://stackoverflow.com/questions/253616

  •  05-07-2019
  •  | 
  •  

Frage

Da DBs nicht wiederverwenden Zahlen von gelöschten Datensätze es möglich ist, aus Zahlen laufen zu lassen, vor allem, wenn Sie für diese Spalte nicht wirklich einen großen integer-Typen auswählen.
Was würde passieren, und wie es zu verhindern, wenn es schlecht ist?

// SQL Server, MySQL //

War es hilfreich?

Lösung

Ich denke, genau das, was auf welcher Datenbank-Engine Sie verwenden wird abhängig geschieht (es sogar Unterschiede zwischen INNODB und MyISAM in MySQL sein kann). Was auch immer passiert, es wird nicht schön sein.

Sie würden einfach den Spaltentyp auf eine größere ganze Zahl ändern.

Andere Tipps

Sie am Ende mit einer 3 + Stunden Ausfallzeit auf, wie Slashdot hat auf ihre Kommentare-Funktion.

Für MySQL wird dokumentiert, dass :

  

Das Verhalten des Auto-Inkrement-Mechanismus ist nicht definiert, wenn ein Benutzer einen negativen Wert in die Spalte zugewiesen oder wenn der Wert größer wird als die maximale Ganzzahl, die in dem angegebenen Integer-Typ gespeichert werden kann.

Die meisten Datenbanksysteme haben einen numerischen Datentyp, der breiter ist als 32 Bits sein kann. Wenn Sie mehr als 2 ^ 32 Datensätze antizipieren sollten Sie eine entsprechende Schlüsselweite verwenden.

Ja, es ist möglich: Wenn Sie nur für 2-stellige Zahlen erlauben können Sie nur IDs bis zu 99 haben, und so weiter. Einsätze scheitern würden, sobald die Grenze erreicht wurde. Es ist eine Frage des gesunden Menschenverstand eine geeignete Größe zu wählen.

In Postgres, der „Serie“ Typ entspricht die Schaffung einer Sequenz mit der NO-CYCLE-Option und die Einstellung des Standard des Feldes NEXTVAL. Anstrengend eine solche Sequenz erzeugt einen Fehler:

http://www.postgresql.org/docs/8.3 /interactive/sql-createsequence.html

Es ist auf Ihrer Datenbank hängt, glaube ich, in MS SQLServer, können Sie einfach keine neue Zeilen einfügen, bis Sie das Problem beheben. Das letzte Mal, dass ich es begegnete, fixierten wir das Problem, indem die Identität Spalte 1. Nachsaat Das ist offensichtlich nicht eine universelle Lösung, aber es war in Ordnung mit unserer Situation.

Oracle nicht selbstinkrementierende ID Spalten und gängige Praxis ist die Verwendung eines Sequenzgenerator unterstützen. Eine Sequenz erzeugt ganze Zahlen von bis 28 Ziffern, wenn Sie also aus denen laufen dann ... Ich denke, man einen ziemlich großen Tisch. Aber Verhalten würde dann von der Konfiguration des Sequenzgenerators abhängig sein -. Entweder ein Fehler oder es würde Zyklus wieder auf den Startwert und Sie würden eine PK Einschränkungsverletzung auf dem nächsten Einsatz bekommen

Ich habe versucht, dies in SQL 2000 vor einiger Zeit. Nach Integer.MaxValue ist der nächste Identitätswert Integer.MinValue. Es hält dann zu zählen, wie Sie es erwarten würde. Solange die Datensätze, die in 1,2,3 usw. existieren verwendet wurden von der Zeit gegangen wird es dort nichts Schlimmes passieren wird. Wenn es in ein Duplikat läuft (und das Feld ist der Primärschlüssel), dann scheitert der Einsatz mit einer Schlüsselverletzung. Ich habe keine Identitätsspalte versucht, die allerdings nicht auf eindeutige Werte beschränkt ist. Ich würde vermuten, es wäre zufrieden mit den Duplikaten.

Im Allgemeinen werden Sie eine Fehlermeldung erhalten. Verwenden Sie einen BIGINT, wenn Sie paranoid sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top