Maximum für autoincremental int Primärschlüssel in SqlServer

8

Gibt es ein Maximum? Wird SQL Server SqlExceptions auslösen, wenn das Maximum erreicht ist? Wie lösen Sie es? (Archivierung?)

Von den SQL Server-Ressourcen kann ich sehen, dass das Maximum 2,147,483,647 ist. Ich bin weit davon entfernt, aber ich war nur neugierig.

    
Lieven Cardoen 19.02.2010, 10:58
quelle

5 Antworten

6

Sie können den Fehler mit diesem kleinen Beispiel sehen

%Vor%

der Fehler:

%Vor%     
sergiom 19.02.2010, 11:15
quelle
9

Das Maximum für eine int ist tatsächlich 2.147.483.647.

Wenn Sie versuchen, die maximale Größe zu überschreiten, erhalten Sie diesen Fehler:

%Vor%

Wenn das nicht groß genug ist, verwenden Sie bigint (9,223,372,036,854,775,807)

    
Mitch Wheat 19.02.2010 11:02
quelle
5

Das Maximum wird durch den Datentyp definiert, nicht durch den Modifikator IDENTITY . Für eine Spalte INT haben Sie bereits das Maximum herausgefunden. Wenn Sie einen Datentyp mit einem größeren Bereich benötigen, ist BIGINT die offensichtliche Wahl, und es kann sehr gut IDENTITY markiert werden.

  • TINYINT : 0 bis 255
  • SMALLINT : -32768 bis 32767
  • INT : -2147483648 bis 2147483647
  • BIGINT : -9223372036854775808 bis 9223372036854775807

Ich würde erwarten, dass ein Fehler auftritt, wenn versucht wird, Zeilen einzufügen, nachdem das Maximum erreicht wurde, da die IDENTITY -Implementierung immer noch versuchen würde, mit jeder Einfügung zu inkrementieren.

Während es sicherlich möglich wäre, Zeilen in einem anderen Datenspeicher zu archivieren und die Wiederverwendung von Bezeichnern zu starten ( DBCC CHECKIDENT (jobs, RESEED, 0) setzt den Zähler zurück), bietet SQL Server dies nicht direkt an. Sie müssen die Logik dafür selbst implementieren, und Sie müssen darüber nachdenken, welche Art von Problemen die Wiederverwendung von Kennungen Ihrer Anwendung bringen könnte. Werden zum Beispiel bei einer Webanwendung alte URLs plötzlich auf neue Dokumente zeigen oder 404 Fehler zurückgeben?

    
Jørn Schou-Rode 19.02.2010 11:02
quelle
1

Beachten Sie, dass Sie die ID zurücksetzen, wenn Sie die Tabelle abschneiden. Kann in Fällen hilfreich sein, in denen Sie die Tabelle nicht löschen und neu erstellen können.

    
Ori Samara 06.03.2014 20:40
quelle
1

Wenn Sie beispielsweise den Datentyp INT für Ihren Primärschlüssel verwenden möchten und bis zum Ende der Kapazität dieses Datentyps gegangen sind, müssen Sie Folgendes tun:

  1. Löschen Sie ältere Daten. Löschen Sie zum Beispiel aus TABLENAME where pk & lt; 1000000 Wenn Ihre Daten wichtig sind, müssen Sie sie natürlich vor dem Löschen in eine Archivtabelle verschieben. Auf diese Weise wird der Bereich von 1 bis 1000000 frei und Sie können es verwenden. Angenommen, Ihr Primärschlüssel wird dynamisch eingefügt. Auf diese Weise müssen Sie Ihren Primärschlüssel RESEED.
  2. Führen Sie diese Abfrage in Ihrer Tabelle aus:

    DBCC CHECKIDENT (Tabellenname, RESEED, 0)

Auf diese Weise wird Ihr Datensatz mit dem Primärschlüssel von 1 eingefügt.

Aber bedenken Sie, dass wenn Ihr PC 1000001 erreicht, ein Fehler auftritt, weil dieser Primärschlüssel in Ihrer Tabelle existiert. Mit anderen Worten, Sie müssen immer Ihren Primärschlüssel berücksichtigen.

    
vahid basirat 24.11.2016 15:03
quelle

Tags und Links