Domanda

sto facendo un programma per l'esecuzione su SQL Server e PostgreSQL, quindi mi chiedo questa domanda sulla entrambi.

Che cosa accade ogni volta che si crea una chiave primaria univoca (usando una sequenza o di tipo auto-incremento cosa) e si colpisce più di 4 miliardi di record (32 bit)? Non sto dicendo che il nostro tavolo avrà 4 miliardi di record, ma piuttosto che 4 miliardi di record sono stati creati perché gli unici incrementi RID. Quindi, anche se ho cancellato 3,9 miliardi di questi record, le mie RID sono ancora nel range 4 miliardi. Quindi cosa succede? Lo fa la precisione a 64 bit o lo fa rotolare a 0 o semplicemente sputare un errore molto critica? Dovrei preoccuparmi che anche un po '64 RID può finalmente traboccare anche?

Inoltre, come posso combattere contro questo? C'è una sorta di pulizia opzione o uno strumento? Non mi resta che creare la mia cosa per ogni anno o così completamente ricostruire la tabella per ottenere RID coerenti? (E quindi anche toccare un sacco di altri tavoli che utilizzano questi RID sono le chiavi esterne)

È stato utile?

Soluzione

PostgreSQL, per impostazione predefinita, l'errore e non overflow:

# 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)

Dalla documentazione:

  

Le sequenze sono basati su aritmetica bigint, quindi l'intervallo non può superare il campo di un numero intero di otto byte (-9223372036854775808 a 9223372036854775807). Su alcune piattaforme più anziani, ci potrebbe essere alcun supporto compilatore per interi a otto byte, in cui le sequenze caso l'uso regolare aritmetica intera (-2147483648 e +2147483647).

Tuttavia, si può rendere ciclo:

  

L'opzione CYCLE permette alla sequenza di avvolgere intorno quando il maxvalue o minvalue è stato raggiunto da un ascendente o discendente sequenza rispettivamente. Se viene raggiunto il limite, il numero successivo generato sarà rispettivamente minvalue o maxvalue,.

     

Se non è specificato alcun ciclo, tutte le chiamate alla nextval dopo la sequenza ha raggiunto il suo valore massimo restituirà un errore. Se non sono specificati né CYCLE o NO CYCLE, nessun ciclo è il default.

Non combatterlo. Spendere i byte in più e mantenere le cose semplici. È molto più probabile di rimpiangere l'aggiunta di ulteriori livelli di complessità e / o attività di manutenzione che avere uno spazio delle chiavi più grande.

Altri suggerimenti

In SQL Server: Dipende dal tipo di colonna RID. L'identità interna può aumentare, ma non riuscirà a assegnare alla colonna stoarge:

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')

questo innesca errore:

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

Ma una colonna numerica con memoria sufficiente incrementerà bene:

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')

Allo stesso modo un bigint sarà overlfow a 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')

, ma una colonna numerica con archiviazione sufficiente avrà successo:

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')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top