web-dev-qa-db-ja.com

IDENTITY値をリセット

IDENTITY列のあるテーブルがあります。開発中、時々行を削除して再度追加します。しかし、IDENTITYの値は常に増加し続け、再度追加したときに1から始まっていませんでした。これで私のIDは68-> 92になり、これによりコードがクラッシュします。

IDENTITY値をリセットするにはどうすればよいですか?

16
Gijs

次の方法でID値をリセットできます。

DBCC CHECKIDENT('tableName', RESEED, 0)

したがって、次にTableNameに挿入するとき、挿入されるID値は1になります。

テーブルから行をdelete削除すると、Identity値はリセットされませんが、増加し続けます。あなたの事件で起こったことのように。

これで、テーブルをtruncateすると、ID値がテーブルの元のSeed値にリセットされます。

詳細な例と 切り捨てと削除の違い の詳細な例といくつかの適切な説明については、 SQL SERVER – DELETE、TRUNCATEおよびRESEED Identity を参照してください。

29
Kin Shah

KinはIDENTITY値をリセットする方法を示しましたが、実際にデータのallを削除する場合、開発環境の外では、なぜこれを行う必要があるのですか?

本番環境では、IDENTITY値の連続したシーケンスを維持するつもりはないでしょう。そして、IDENTITY値をハードコードするコードを実際に作成していないことを願っています。これらが意味のあるID値である場合は、IDENTITYプロパティの使用を停止する必要があります。

これが起こらないようにするいくつかの事柄があります:

  • トランザクション中にIDENTITY値が割り当てられ、トランザクションがロールバックされた場合、値は「ギブバック」されず、次の値は使用されていない値+ 1になります。
  • 行が後で削除された場合、IDENTITYがギャップを埋めるために戻ることはありません。
  • sQL Server 2012にはアクティブなバグがあり、 sQL Server 2014まで修正されません が修正されることは決してありません(ドキュメント化されていない非常に高価なトレースフラグを使用しない限り)。これにより、再起動によってIDENTITY列から最大1000個の値が破棄されるようです。 Connectのバグ は、これが可用性グループに関係するフェイルオーバーイベントに限定されていることを示唆していますが、バグはそれよりもはるかに広範囲であることを保証できます。

つまり、ギャップを気にする場合、またはこれらの値に特定の意味を与えたい場合は、IDENTITYの使用を停止してください。テーブルを削除して再作成し、値を削除して再入力する必要がある場合は、更新を実行するか、その列のハードコードされた値を使用して挿入を実行します。

余談ですが、主キーとIDは同じものではありません。 ID列は、明示的に定義しない限り、主キーではありません。また、ID列ではない主キーを確実に持つことができます。

22
Aaron Bertrand