L'identité de l'incrément est de sauter dans la base de données SQL Server
Dans une de mes tables Fee
dans la colonne "ReceiptNo" dans SQL Server 2012 à l'identité de base de données incrément soudainement commencé le saut à 100 au lieu de 1, selon la suivante de deux choses.
-
si c'est 1205446 il saute à 1206306, si elle est 1206321, il saute 1207306 et si c'est 1207314, il saute 1208306. Ce que je veux vous faire est à noter que les trois derniers chiffres rester constante, que je.e 306 chaque fois que le saut se produit, comme illustré dans l'image suivante.
-
ce problème se produit lorsque je redémarre mon ordinateur
- Si vous ajoutez
order by ReceiptNo
à votre requête sont les enregistrements vraiment pas là? Êtes-vous sûr que lorsque les enregistrements sont insérés il n'y a pas d'erreurs? Si un enregistrement des tentatives pour obtenir insérée et ne réussit pas l'identité de l'incrémenter, même chose si les enregistrements sont supprimés. Si les enregistrements sont supprimés à laReceiptNo
ne se réinitialise pas. Pouvez-vous poster le create table pour lesFee
table? - Première question: pourquoi est-il important? il convient de l'arbitraire d'un ID unique
- Est-ce en cours d'exécution sur un serveur ou est-il peut-être exprimer sur un ordinateur de bureau? Vous vous demandez pourquoi il semble que le service est redémarré si souvent?
- Je sais que lorsque l'erreur se produit, l'identité de l'incrément a lieu. Je suis sûr à 100% il n'y a pas d'erreurs. Im édition de ma question en ajoutant de la table et de la procédure stockée que j'utilise pour insérer les lignes.
- Sûr à 99% que ce n'est pas nécessaire. Les sauts par exactement 1 000 habitants (
1206306
,1207306
,1207806
) signifie l'explication de l'Élément de connexion Fil presque certainement s'applique. - Il n'est pas un serveur. c'est une machine avec windows 8 et sql server 2012 installé en elle. pc est alimenté à chaque fois que le centre de coaching est éteint. le lendemain, lorsque le centre s'ouvre, ils allumez le pc de nouveau
- Ainsi que l'explique ensuite. Chaque fois qu'il est alimenté par le solde non utilisé des numéros du "lot" sont perdus alors quand il commence alors à nouveau, il se réserve un lot de 1 000 à partir du moment où ce lot sera fini.
- double possible de valeur de la colonne Identité soudainement saute aux 1001 dans sql server
- github.com/aspnet/EntityFrameworkCore/issues/8252
Vous devez vous connecter pour publier un commentaire.
Vous êtes probablement à la rencontre de la question ici (wayback machine).
SQL Server 2012 utilise maintenant une taille de mémoire cache de 1 000 lors de l'attribution de
IDENTITY
valeurs dans unint
colonne et de redémarrer le service peut "perdre" valeurs inutilisées (La taille du cache est de 10 000 pourbigint
/numeric
).À partir des données que vous avez montré qu'il ressemble à ce qui s'est passé après la saisie des données pour les 22 décembre, alors quand il redémarrage de SQL Server réservés les valeurs
1206306 - 1207305
. Après l'entrée des données, pour les 24 - 25 décembre a été fait un autre redémarrage de SQL Server et réservée à la plage suivante1207306 - 1208305
visible dans les entrées pour le 28.À moins que vous redémarrez le service avec une rare fréquence tout "perdu" les valeurs sont peu susceptibles d'apporter une atteinte significative dans la plage de valeurs autorisées par le type de données de sorte que la meilleure politique est de ne pas s'en soucier.
Si c'est pour une raison quelconque, un réel problème pour vous, consultez les solutions de contournement sur le lien se Connecter Élément de fil.
ORDRE
au lieu d'une colonne d'identité et de définir une plus petite taille de la mémoire cache, par exemple, et utiliserNEXT VALUE FOR
dans une colonne par défaut.IDENTITY
allocation connecté comme dans les versions précédentes.Vous devez être conscient aucune de ces solutions de contournement s'assurer qu'aucun des lacunes. Cela n'a jamais été garanti par
IDENTITY
qu'il ne sera possible que par la sérialisation d'insertions dans la table. Si vous avez besoin d'une instantanés de la colonne que vous aurez besoin d'utiliser une autre solution que soitIDENTITY
ouSEQUENCE
SEQUENCE
au lieu d'uneIDENTITY
et de définir la Séquence d'avoir une taille de cache de0
.CREATE TABLE
je vois que vous êtes en utilisantnumeric(7)
et ont commencé la numérotation off à1200001
cela signifie que vous exécutez après8,799
jours (24 ans), si vous utilisez plus de 1000 par jour.big int
colonne va généralement de "sauter" par 10 000 par redémarrer.Ce problèmes se produit après le redémarrage du Serveur SQL.
La solution est:
Exécuter Gestionnaire de Configuration SQL Server.
Sélectionnez les Services SQL Server.
Cliquez-droit sur SQL Server et sélectionnez Propriétés.
Dans la fenêtre qui s'ouvre sous Paramètres de Démarrage, type
-T272
et cliquez sur Ajouter, puis appuyez sur Appliquer bouton et de le redémarrer.De
SQL Server 2017+
vous pouvez utiliser MODIFIER LA BASE DE DONNÉES ÉTENDUE DE CONFIGURATION:Je sais que ma réponse risque d'être en retard à la fête. Mais j'ai résolu d'une autre manière par l'ajout d'une procédure stockée dans SQL Server 2012.
Créer une procédure stockée suivante en maître DB.
Puis l'ajouter au Démarrage en utilisant la syntaxe suivante.
C'est une bonne idée si vous avez quelques tables. mais si vous devez le faire pour de nombreuses tables, cette méthode fonctionne toujours, mais pas une bonne idée.
C'est encore un problème très commun chez de nombreux développeurs et les applications indépendamment de la taille.
Malheureusement, les suggestions ci-dessus ne permettent pas de résoudre tous les scénarios, c'est à dire l'hébergement Partagé, vous ne pouvez pas compter sur votre hôte pour définir le -t272 paramètre de démarrage.
Aussi, si vous avez des tables existantes qui utilisent ces colonnes d'identité pour les clés primaires, c'est un ÉNORME effort de laisser tomber ces colonnes et de recréer de nouveaux pour utiliser le BS séquence de solution de contournement. La Séquence de solution de contournement n'est bon que si vous concevez les tables de nouveau à partir de zéro dans SQL 2012+
Ligne du bas est, si vous êtes sur Sql Server 2008R2, puis RESTER SUR ELLE. Sérieusement, rester sur elle. Jusqu'à ce que Microsoft admet qu'ils ont introduit un ÉNORME bug, qui est toujours là, même dans Sql Server 2016, alors on ne doit pas mettre à niveau jusqu'à ce qu'ils possèdent et le FIXER.
Microsoft tout droit jusqu'a introduit une modification de rupture, c'est à dire ils ont cassé un travail API qui ne fonctionne plus comme prévu, en raison du fait que leur système oublie son identité en cours sur un redémarrage. Ou aucun Cache, ce qui est inacceptable, et le Microsoft développeur du nom de Bryan doit posséder, au lieu de dire au monde que c'est "by design" et une "fonction". Bien sûr, la mise en cache est une fonction, mais de perdre la trace de ce que l'identité suivante devrait être, n'EST PAS UNE FONCTION. C'est un fricken BUG!!!
Je vais partager la solution de contournement que j'ai utilisé, parce que Ma DB sont sur les serveurs d'Hébergement Partagé, aussi, je ne suis pas la suppression et recréation de mon colonnes de Clé Primaire, ce serait un énorme pain PITA.
Au lieu de cela, c'est mon honteux hack (mais pas aussi honteux que ce POS bug que microsoft a mis en place).
Hack/Fix:
Avant vos insérer des commandes, juste réensemencer votre identité avant chaque insertion. Ce correctif est seulement recommandé si vous n'avez pas l'administrateur de contrôler votre instance de Sql Server, sinon je suggère de réensemencement au redémarrage du serveur.
Juste ces 3 lignes immédiatement avant de votre appareil, et vous devriez être bon d'aller. Il vraiment n'affecte pas le rendement que beaucoup, c'est à dire qu'il sera imperceptible.
Goodluck.
Il y a beaucoup de raisons possibles pour sauter les valeurs d'identité. Ils vont du restaurée insère à la gestion de l'identité pour la réplication. Quelle en est la cause dans votre cas, je ne peux pas dire sans passer quelque temps dans votre système.
Vous devez savoir, cependant, que, en aucun cas, vous pouvez supposer une colonne d'identité pour être contiguos. Il y a juste trop de choses qui peuvent causer des lacunes.
Vous pouvez trouver un peu plus d'informations à ce sujet ici: http://sqlity.net/en/792/the-gap-in-the-identity-value-sequence/