2008-10-31 11 views
5

Seit DBs do not reuse numbers of deleted records ist es möglich, Zahlen auslaufen, vor allem, wenn Sie nicht wirklich einen großen Integer-Typ für diese Spalte auswählen.
Was würde passieren und wie kann man es verhindern, wenn es schlecht ist?Was passiert, wenn der DB-Engine keine Nummern mehr für Primärschlüssel zur Verfügung stehen?

// SQL Server, MySQL //

+1

BTW, könnten Sie am Ende Nummern aus gelöschten Aufzeichnungen wiederverwenden; Lies meine Antwort auf deine vorherige Frage ... –

+0

Danke. Aber diese Funktion ist eigentlich ein Fehler. : | –

+2

Es wird als Fehler gemeldet, aber der Status des Fehlerberichts lautet "Kein Fehler".Also muss es ein Feature sein :-) –

Antwort

4

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

Sie müssten den Spaltentyp einfach in eine größere Ganzzahl ändern.

2

For MySQL, it is documented that:

The behavior of the auto-increment mechanism is not defined if a user assigns a negative value to the column or if the value becomes bigger than the maximum integer that can be stored in the specified integer type.

+0

Nicht definiert ist besser als unbenutzte ID automatisch zu überschreiben/wiederverwenden, was die Tabellen-Tabellen-Beziehung beeinflussen könnte – faulty

+1

Sicher "nicht definiert" könnte die Wiederverwendung von IDs bedeuten? – biozinc

1

Ja, es ist möglich: Wenn Sie nur 2-stellige Nummern zulassen, können Sie nur IDs bis 99 haben, und so weiter. Einfügungen würden fehlschlagen, sobald das Limit erreicht wurde. Es ist eine Frage des gesunden Menschenverstandes, eine angemessene Größe zu wählen.

9

Sie haben am Ende eine 3+ Stunden Ausfallzeit, wie Slashdot auf ihre Comments-Funktion.

+0

Oh, ich erinnere mich an diesen Tag auch! Die Lösung hat mich schockiert. – willasaywhat

2

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

1

Es hängt von Ihrer Datenbank ab, ich glaube an MS SqlServer, Sie können einfach keine neuen Zeilen einfügen, bis Sie das Problem behoben haben. Das letzte Mal, als ich darauf gestoßen bin, haben wir das Problem behoben, indem wir die Identitätsspalte auf 1 gesetzt haben. Das ist natürlich kein universeller Fix, aber es war in Ordnung mit unserer Situation.

0

Oracle unterstützt keine automatisch inkrementierenden ID-Spalten, und standardmäßig wird ein Sequenzgenerator verwendet. Eine Sequenz erzeugt ganze Zahlen mit bis zu 28 Ziffern. Wenn Sie also keine mehr haben, dann ... ich nehme an, Sie haben einen ziemlich großen Tisch. Aber das Verhalten wäre dann abhängig von der Konfiguration des Sequenzgenerators - entweder ein Fehler oder es würde zu dem Startwert zurückkehren und Sie würden eine PK-Constraint-Verletzung für die nächste Einfügung erhalten.

0

Ich habe dies in SQL 2000 vor einiger Zeit versucht. Nach Integer.MaxValue ist der nächste Identity-Wert Integer.MinValue. Es zählt dann weiter, wie Sie es erwarten würden. Solange die Aufzeichnungen, die bei 1,2,3 usw. existierten, zu der Zeit, zu der es dort ankommt, verschwunden sind, wird nichts Schlimmes passieren. Wenn es in ein Duplikat läuft (und das Feld der Primärschlüssel ist), schlägt die Einfügung mit einer Schlüsselverletzung fehl. Ich habe keine Identitätsspalte ausprobiert, die nicht auf eindeutige Werte beschränkt ist. Ich würde vermuten, dass es mit den Duplikaten zufrieden wäre.

0

Im Allgemeinen erhalten Sie einen Fehler. Benutze einen BIGINT, wenn du paranoid bist.

Verwandte Themen