Frage

Ich mache eine Anwendung, um sowohl auf SQL Server als auch auf PostgreSQL auszuführen, daher stelle ich diese Frage zu beiden.

Was passiert, wenn Sie einen einzigartigen Primärschlüssel erstellen (mithilfe einer Sequenz oder einer automatischen Inkrement-Sache) und Sie über 4 Milliarden Datensätze (32 Bit) gedrückt haben? Ich sage nicht, dass unsere Tabelle 4 Milliarden Datensätze haben wird, sondern dass 4 Milliarden Datensätze erstellt wurden, weil die RID nur in Schritten gestiegen sind. Selbst wenn ich 3,9 Milliarden dieser Aufzeichnungen gelöscht habe, befinden sich meine RIFS immer noch im Bereich von 4 Milliarden. Also, was passiert? Steigt es die Präzision auf 64 Bit oder spuckt es auf 0 oder spuckt nur einen sehr kritischen Fehler aus? Sollte ich mir Sorgen machen, dass auch ein 64 -Bit -Rissen auch irgendwann überlaufen können?

Wie kann ich dagegen kämpfen? Gibt es eine Art Reinigungsoption oder ein Werkzeug? Muss ich nur jedes Jahr mein eigenes Ding kreieren oder so den Tisch komplett wieder aufbauen, um konsequente Rätsel zu bekommen? (Und so auch viele andere Tabellen berühren, die diese RIDs verwenden, sind Fremdschlüssel)

War es hilfreich?

Lösung

PostgreSQL wird standardmäßig Fehler und nicht überlaufen:

# create sequence willyouwrap;
CREATE SEQUENCE
# select setval('willyouwrap', 9223372036854775807);
       setval        
---------------------
 9223372036854775807
(1 row)
# select nextval('willyouwrap');
ERROR:  nextval: reached maximum value of sequence "willyouwrap" (9223372036854775807)

Aus den Dokumenten:

Sequenzen basieren auf Bigint-Arithmetik, sodass der Bereich den Bereich einer Acht-Byte-Ganzzahl (-9223372036854775808 bis 9223372036854775807) nicht überschreiten kann. Auf einigen älteren Plattformen gibt es möglicherweise keine Compiler -Unterstützung für acht Byte -Ganzzahlen. In diesem Fall verwenden Sequenzen die reguläre Ganzzahlarithmetik (Bereich -2147483648 bis +2147483647).

Sie können es jedoch zum Zyklus machen:

Die Zyklusoption ermöglicht es der Sequenz, sich umzuwickeln, wenn der MaxValue oder das Minwert durch eine aufsteigende bzw. absteigende Sequenz erreicht wurde. Wenn die Grenze erreicht ist, ist die nächste generierte Zahl das Minwert bzw. MaxValue.

Wenn kein Zyklus angegeben ist, gibt alle Aufrufe nach NextVal nach dem Erreichen der Sequenz einen Fehler zurück. Wenn weder Zyklus noch kein Zyklus angegeben sind, ist kein Zyklus der Standard.

Kämpfe nicht dagegen. Geben Sie die zusätzlichen Bytes aus und halten Sie die Dinge einfach. Es ist wahrscheinlicher, dass Sie es eher bedauern, zusätzliche Komplexitäts- und/oder Wartungsaufgaben hinzugefügt als einen größeren Schlüsselraum.

Andere Tipps

Auf SQL Server: Es hängt vom Typ der RID -Spalte ab. Die interne Identität kann erhöht werden, wird jedoch nicht der Stoarge -Spalte zuzuweisen:

CREATE TABLE [t1] (
[tid] int IDENTITY (2147483647, 1) NOT NULL
  , name varchar(1)
) ON [PRIMARY]
GO
insert into t1(name) values('1')
insert into t1(name) values('1')

Dies löst einen Fehler aus:

Msg 8115, Level 16, State 1, Line 2
Arithmetic overflow error converting IDENTITY to data type int.
Arithmetic overflow occurred.

Eine numerische Spalte mit ausreichend Speicher wird jedoch in Ordnung inkrementiert:

CREATE TABLE [t1] (
[tid] numeric(38,0) IDENTITY (2147483647, 1) NOT NULL
  , name varchar(1)
) ON [PRIMARY]
GO
insert into t1(name) values('1')
insert into t1(name) values('1')

In ähnlicher Weise überlebt sich ein Bigint bei 2 ^^ 63-1:

CREATE TABLE [t1] (
[tid] bigint IDENTITY (9223372036854775807, 1) NOT NULL
  , name varchar(1)
) ON [PRIMARY]
GO
insert into t1(name) values('1')
insert into t1(name) values('1')

Eine numerische Spalte mit ausreichender Speicherung wird jedoch erfolgreich sein:

CREATE TABLE [t1] (
[tid] numeric(38,0) IDENTITY (9223372036854775807, 1) NOT NULL
  , name varchar(1)
) ON [PRIMARY]
GO
insert into t1(name) values('1')
insert into t1(name) values('1')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top