Que se passe-t-il dans SQL 2005 lorsque le nombre d'une colonne de numérotation automatique est épuisé?

StackOverflow https://stackoverflow.com/questions/262106

Question

Que se passe-t-il lorsque SQL Server 2005 atteint le maximum pour une colonne IDENTITY? Cela commence-t-il depuis le début et commence-t-il à combler le vide?

Quel est le comportement de SQL Server 2005 lorsqu'il se produit?

Était-ce utile?

La solution

Vous obtiendrez une erreur de débordement lorsque la valeur maximale sera atteinte . Si vous utilisez le type de données bigint avec une valeur maximale de 9 223 372 036 854 775 807 , cela ne sera probablement jamais le cas.

Le message d'erreur que vous obtiendrez ressemblera à ceci:

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

(Source)

Autant que je sache, MS SQL ne fournit aucune fonctionnalité permettant de combler les lacunes d'identité, vous devrez donc le faire vous-même ou modifier le type de données de la colonne d'identité.

De plus, vous pouvez définir la valeur de départ sur le plus petit nombre négatif pour obtenir une plage de valeurs encore plus grande.

Voici un bon article de blog sur ce sujet .

Autres conseils

Cela ne comblera pas les lacunes. Au lieu de cela, les insertions échoueront jusqu'à ce que vous modifiiez la définition de la colonne afin de supprimer l'identité et de trouver un autre moyen de combler les espaces vides ou d'augmenter la taille (de int à bigint) ou de modifier le type des données (de int à décimal). ) afin que davantage de valeurs d'identité soient disponibles.

Vous ne pourrez pas insérer de nouvelles lignes et le message d'erreur indiqué ci-dessus s'affichera jusqu'à ce que le problème soit résolu. Vous pouvez le faire de différentes manières. Si vous avez encore des données et utilisez tous les identifiants inférieurs au maximum, vous devrez changer le type de données. Si les données sont régulièrement purgées et que vous avez un grand espace qui ne sera pas utilisé, vous pouvez réattribuer le numéro d'identité au nombre le plus bas de cet espace. Par exemple, lors d'un travail précédent, nous enregistrions des transactions. Nous en avions peut-être 40 à 50 millions par mois, mais nous éliminions tout ce qui datait de plus de 6 mois. Ainsi, l'identité ne serait que de 2 milliards, mais nous n'aurions rien avec un identifiant inférieur à 1,5 milliard, de sorte que nous réensemencerions retour à 0. Encore une fois, il est possible que ni l'un ni l'autre ne fonctionne pour vous et vous devrez trouver une solution différente.

Si la colonne d'identité est un entier, votre maximum est de 2 147 483 647. Vous obtiendrez une erreur de débordement si vous la dépassez.

Si vous pensez que cela constitue un risque, utilisez simplement le type de données BIGINT, qui vous donne 9 223 372 036 854 755 775 807. Impossible d'imaginer une table de base de données avec autant de lignes.

Discussion supplémentaire ici . (Même lien que xsl mentionné).

Si vous atteignez le nombre maximal de votre colonne d'identité, vous pouvez déplacer les données de cette table dans une table secondaire avec un type de colonne d'identité plus grand et spécifier la valeur de départ de cette nouvelle valeur d'identité comme étant la valeur maximale. du type précédent. Les nouvelles valeurs d'identité continueront à partir de ce point.

Si vous supprimez les "anciennes valeurs" de temps en temps il vous suffit de réinitialiser la graine en utilisant DBCC CHECKIDENT ('MyTable', RESEED, 0);

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top