IDENTITY値をリセット


16

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

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


欠落しているID値に対するコードの弾力性を高めます。ID列の連続する番号付けを保証するものではありません、となり、最終的に起こる
Trubs

回答:


29

アイデンティティ値をリセットするには

DBCC CHECKIDENT('tableName', RESEED, 0)

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

テーブルから行を削除しても、Identity値はリセットされませんが、増加し続けます。あなたのケースで起こったことと同じです。

テーブルを切り捨てると、ID値がテーブルの元のシード値にリセットされます。

詳細については、SQLサーバー– DELETE、TRUNCATE、およびRESEED IDを参照してください。また、切り捨てと削除の違いについての適切な説明があります。


22

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

実稼働中にIDENTITY値の連続したシーケンスを維持するつもりがないことを願っています。そして、IDENTITY値をハードコーディングするコードを実際に書いていないことを願っています。これらが意味のあるID値である場合、IDENTITYプロパティの使用を停止する必要があります。

これを防ぐには、いくつかのことがあります。

  • トランザクション中にIDENTITY値が割り当てられ、トランザクションがロールバックされた場合、値は「与えられた」ものではなく、次の値は使用されない値+ 1になります。
  • 行が後で削除された場合、IDENTITYはギャップを埋めるために戻ることはありません。
  • SQL Server 2012にはアクティブなバグがあり、SQL Server 2014 が修正されない限り修正されません(文書化されていない非常に高価なトレースフラグを使用しない限り)。 。Connectのバグは、これが可用性グループに関係するフェイルオーバーイベントに制限されていることを示唆していますが、バグはそれよりもはるかに広いことを保証できます。

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

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


-4

IDフィールドの増分値に従わない最後の行のみを削除する必要がある場合、簡単で安全な方法があります。

  1. 最初に「ジャンプ」した最後のレコードを削除します
  2. IDフィールドのデータ型を変更する(intからbigintまたはその逆)
  3. テーブルを保存する
  4. 新しいレコードを追加し、それが最大値+ 1の番号を割り当てることを確認します
  5. 必要に応じて、IDフィールドのデータ型を置き換えます

これで完了です。


3
「テーブルを保存する」は、SQL Serverにとって意味のあるステートメントではありません。データ型の変更は、100行未満の簡単な場合もありますが、大きなテーブルの場合は非常にコストがかかることがあります。
マイケルグリーン

2
私はあなたがSSMSで意味すると仮定します。これにより、新しいテーブルが作成され、すべての行がコピーされ、古いテーブルが削除され、新しいテーブルの名前が変更されます。そして、データ型を元に戻すには、これを2回行う必要があります。ハンマーを使ってナットを割っています。
マーティンスミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.