ホームページ > データベース > mysql チュートリアル > SQL Server 2012 の ID 列で値がスキップされるのはなぜですか?

SQL Server 2012 の ID 列で値がスキップされるのはなぜですか?

Mary-Kate Olsen
リリース: 2025-01-18 02:39:10
オリジナル
968 人が閲覧しました

Why Does My SQL Server 2012 Identity Column Skip Values?

SQL Server 2012 の ID 列のギャップ: トラブルシューティングと解決策

SQL Server 2012 の自動インクリメント ID 列は、予期しない動作を示し、値をスキップすることがあります。たとえば、7 回目の挿入で 6 から 1000 に直接ジャンプします。 この記事では、根本原因を調査し、効果的な解決策を提供します。

問題を理解する

不規則な増分動作は、SQL Server 2012 で ID 値生成のためのシーケンスが導入されたことに起因します。 この変更は、ID キーの割り当て方法に影響します:

  • 内部値キャッシュ: シーケンスはパフォーマンスの最適化のためにキャッシュを使用し、値の範囲を事前に割り当てます。
  • 一括挿入: 複数の行を同時に挿入すると、ギャップが生じる可能性があります。シーケンスは数値のブロックを割り当てます。そのブロック内の未使用の値は、すべてがすぐに消費されない場合にスキップを作成します。

問題の解決

いくつかのアプローチでこの問題に対処し、ID 列を順次増分することができます。

方法 1: キャッシュを無効にする

2012 年以前の動作を復元するには、次のコマンドを使用してキャッシュを無効にします。

<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>
ログイン後にコピー

方法 2: トレース フラグ 272 を利用する

トレース フラグ 272 を有効にして、生成された各 ID 値を監視します。 この詳細なログにより、シーケンス キャッシュ メカニズムの問題を正確に特定できます。

方法 3: NO CACHE シーケンスを使用する

キャッシュなしで明示的に構成されたシーケンス ジェネレーターを作成します (NO CACHE)。これにより、厳密に連続した増分が保証され、ギャップが防止されます。

<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>
ログイン後にコピー

これらのソリューションを実装することで、SQL Server 2012 の ID 列の予期される動作を維持し、データの不整合やギャップを防ぐことができます。

以上がSQL Server 2012 の ID 列で値がスキップされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート