it-swarm-fr.com

Que faire quand un champ d'une table approche de l'entier de 32 bits signé ou non signé Max?

Dans une base de données donnée qui détient des enregistrements d'utilisateur sous la forme d'un champ unique d'incrément automatique (pour l'exemple de l'exemple, des messages inter-utilisateur) ... Que faire lorsque le temps vient et qu'il approche du nombre maximum signé ou non signé. du type de données actuel? (Un 32 bits int)? Je suppose que le serveur de base de données déborderait lorsqu'il tenterait d'attribuer le numéro (2∧32) -1 à l'entrée suivante, de manière à éviter que cela se produise (sans changer le type de données, pour le bien de la question) et Continuez d'ajouter des enregistrements? Qu'est-ce que tu ferais?

Pourquoi devrais-je utiliser INT et non, par exemple, Varchars?

Cela fait plusieurs jours que je me suis demandé cette question hypothétique et j'aimerais savoir ce qu'un professionnel ferait.

14
AeroCross

Vous utiliseriez généralement des entiers plutôt que des varcharars car ils consomment moins d'espace, ont un motif de tri rapide à l'index de manière rapide à l'index, etc. Les entiers sont des types de données naturels d'une CPU, et donc des performances sont généralement optimales. Généralement, un entier est de 4 octets, ce qui équivaut à seulement 4 caractères dans un Varchar (non unicode).

Si vous craigniez de manquer d'espace avec un type INT, essayez Bigint, ce qui vous donne des numéros de 8 octets. La limite de ceci est assez énorme, et vous manquerez probablement d'espace disque avant d'atteindre cette limite d'enregistrements :-) La performance de Bigint va également être très bonne, surtout que de nombreux serveurs sont maintenant de 64 bits. .

La réponse à la première partie de votre question sur ce qui se passe lorsque vous êtes à l'origine de INTS n'est pas simple, surtout comme vous l'avez dit sans changer le type de données sur Bigint. Fondamentalement, il n'y a pas grand chose que vous puissiez faire et ce que vous pourrez peut-être faire est limité beaucoup par la nature des données de votre base de données. Quels sont les enregistrements à l'étranger à ces données? Avez-vous toujours besoin de toutes les données de cette table et des enregistrements associés? Sur l'hypothèse que vous pourriez archiver beaucoup de données initiales (et ses données associées), la seule chose que je peux suggérer peut bouger les données de la table (disons les premiers 1 à x millions d'enregistrements), puis réinitialisation de la graine d'identité à 1. Il y a toutes sortes de raisons, même si je ne le recommanderais pas - par exemple, il existe de nombreux bits de code que j'ai vu que des choses comme vérifient la valeur maximale d'un champ d'identification, pour voir ce qui voit été ajouté, et cela ne fonctionnerait pas (et ne devrait pas être fait). En outre, les gens supposent que l'enregistrement N a été créé avant N + 1. Pas de réponse facile je pense.

Enfin, je ne sais pas sur MySQL, mais SQL Server donnerait une erreur de débordement si vous avez atteint la limite.

12
Miles D

Un point négligé est que de nombreux folks démarrent le numéro automatique ou l'identité à 1 perdant ainsi la moitié de la plage possible immédiatement (pour la signature)

Vous feriez simplement redéfinir le nombre pour commencer à -1, incrément -1 dans ce cas.

Sans doute, si vous devriez jamais remplir votre colonne d'identité, vous devriez avoir conçu cela et utilisé un type de données plus vaste au début.

Voir cette question récente Oon SO: SQL Server 2008: Que s'est-il passé si l'identité dépasse une valeur maximale de INT?

9
gbn

Overflow Bigint? Haha. Déterminez d'abord comment réaliser l'immortalité. Int non signé (4 milliards) est suffisamment difficile pour atteindre. 100 inserts par seconde se rapprocheraient d'INT débordant dans un an. Bigint prendrait plusieurs milliards d'années.

Pour fixer: Alter Tableau FOO Modifier la colonne ID de colonne Bigint non signé Non NULL Auto_increment; Mais cela prendra des heures car il va copier sur la table (qui a environ 4 milliards de rangées, non?) Et reconstruire tous les index secondaires. Planifier à l'avance.

En règle générale, lorsque vous essayez de stocker un numéro trop grand pour un champ (par exemple, 999 dans un tinytins non signé), il le pilotera silencieusement au maximum pour le champ (255 dans ce cas). Il peut y avoir un "avertissement", mais la plupart des gens ne se préoccupent pas de vérifier les avertissements. S'il s'agit d'un champ unique, ou il y a des clés étrangères, vous pourriez avoir une erreur plus grave.

Char ou Varchar est silencieusement tronqué dans l'espace disponible.

4
Rick James