Maison >base de données >tutoriel mysql >Pourquoi ma colonne d'identité SQL Server 2012 ignore-t-elle les valeurs ?

Pourquoi ma colonne d'identité SQL Server 2012 ignore-t-elle les valeurs ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-18 02:39:10978parcourir

Why Does My SQL Server 2012 Identity Column Skip Values?

Lacunes des colonnes d'identité SQL Server 2012 : dépannage et solutions

Les colonnes d'identité à incrémentation automatique de SQL Server 2012 présentent parfois un comportement inattendu, sautant des valeurs, par exemple, passant directement de 6 à 1 000 lors de la septième insertion. Cet article explore les causes profondes et propose des solutions efficaces.

Comprendre le problème

Le comportement d'incrémentation irrégulier découle de l'introduction par SQL Server 2012 de séquences pour la génération de valeurs d'identité. Ce changement affecte la manière dont les clés d'identité sont attribuées :

  • Mise en cache des valeurs internes : Les séquences utilisent la mise en cache pour l'optimisation des performances, en pré-attribuant une plage de valeurs.
  • Insertions groupées : L'insertion simultanée de plusieurs lignes peut entraîner des espaces. La séquence alloue un bloc de nombres ; les valeurs inutilisées dans ce bloc créent des sauts si toutes ne sont pas immédiatement consommées.

Résoudre le problème

Plusieurs approches peuvent résoudre ce problème et garantir des incréments séquentiels de colonnes d'identité :

Méthode 1 : Désactiver la mise en cache

Pour restaurer le comportement d'avant 2012, désactivez la mise en cache à l'aide de ces commandes :

<code class="language-sql">ALTER DATABASE [YourDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
ALTER TABLE [TableWithIdentity] ADD PRIMARY KEY ([ColumnName]) WITH (IDENTITY(1, 1));
GO
ALTER DATABASE [YourDatabase] SET MULTI_USER;</code>

Méthode 2 : Utiliser l'indicateur de trace 272

Activez l'indicateur de trace 272 pour surveiller chaque valeur d'identité générée. Cette journalisation détaillée peut identifier les problèmes liés au mécanisme de mise en cache des séquences.

Méthode 3 : Utiliser une NO CACHE Séquence

Créez un générateur de séquence explicitement configuré sans mise en cache (NO CACHE). Cela garantit des incréments strictement séquentiels, évitant les écarts.

<code class="language-sql">CREATE SEQUENCE [YourSequenceName] AS INT
START WITH 1 INCREMENT BY 1 NO CACHE;
ALTER TABLE [TableWithIdentity] ADD PRIMARY KEY ([ColumnName]) WITH (IDENTITY(1, 1));
GO</code>

En mettant en œuvre ces solutions, vous pouvez maintenir le comportement attendu de vos colonnes d'identité SQL Server 2012, évitant ainsi les incohérences et les lacunes des données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn