Domanda

Cosa succede quando SQL Server 2005 raggiunge il massimo per una colonna IDENTITY? Comincia dall'inizio e inizia a colmare il divario?

Qual è il comportamento di SQL Server 2005 quando si verifica?

È stato utile?

Soluzione

Riceverai un errore di overflow quando viene raggiunto il valore massimo . Se si utilizza il tipo di dati bigint con un valore massimo di 9.223.372.036.854.775.807 molto probabilmente non sarà mai così.

Il messaggio di errore che riceverai apparirà così:

Msg 220, Level 16, State 2, Line 10
Arithmetic overflow error for data type tinyint, value = 256.

(Fonte)

Per quanto ne so MS SQL non offre alcuna funzionalità per colmare le lacune di identità, quindi dovrai farlo da solo o cambiare il tipo di dati della colonna identità.

Inoltre, puoi impostare il valore iniziale sul numero negativo più piccolo, per ottenere un intervallo di valori ancora maggiore da utilizzare.

Ecco un buon post sul blog su questo argomento .

Altri suggerimenti

Non colmerà le lacune. Gli inserimenti invece falliranno fino a quando non cambi la definizione della colonna per eliminare l'identità e trovare un altro modo di riempire gli spazi vuoti o aumentare le dimensioni (passare da int a bigint) o cambiare il tipo di dati (da int a decimale ) in modo che siano disponibili più valori di identità.

Non sarai in grado di inserire nuove righe e riceverai il messaggio di errore sopra elencato fino a quando non risolvi il problema. Puoi farlo in diversi modi. Se hai ancora dati e stai usando tutti gli ID al di sotto del massimo, dovrai cambiare il tipo di dati. Se i dati vengono eliminati su base regolare e si dispone di un ampio divario che non verrà utilizzato, è possibile ridimensionare il numero di identità al numero più basso in tale divario. Ad esempio, in un precedente lavoro registravamo le transazioni. Avevamo forse 40-50 milioni al mese, ma stavamo eliminando tutto più di 6 mesi, quindi ogni pochi anni l'identità si avvicinava a 2 miliardi, ma non avremmo nulla con un ID inferiore a 1,5 miliardi, quindi avremmo restituito torna a 0. Ancora una volta è possibile che nessuno di questi funzionerà per te e dovrai trovare una soluzione diversa.

Se la colonna identità è un numero intero, il numero massimo è 2.147.483.647. Riceverai un errore di overflow se lo superi.

Se pensi che questo sia un rischio, usa semplicemente il tipo di dati BIGINT, che ti dà fino a 9.223.372.036.854.775.807. Non riesco a immaginare una tabella di database con così tante righe.

Ulteriori discussioni qui . (Stesso link di xsl menzionato).

Nel caso in cui si raggiunga il numero massimo per la propria colonna di identità, è possibile spostare i dati da quella tabella in una tabella secondaria con un tipo di colonna di identità più grande e specificare il valore iniziale per quel nuovo valore di identità come massimo del tipo precedente. I nuovi valori di identità continueranno da quel punto.

Se elimini " vecchi valori " di tanto in tanto devi solo ripristinare il seed usando DBCC CHECKIDENT ('MyTable', RESEED, 0);

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top