2010-11-26 19 views
11

SQL Server 2008 Expressで行を削除した後にIDフィールドの値を再利用することはできますか?ここに例があります。プライマリキー(ID)としてIdフィールドを持つテーブルがあるとします。 5行を追加すると、これらの5つのID:1,2,3,4,5が表示されます。これらの行を削除してからさらに5つ追加すると、新しい行にはIDが6,7,8,9となります。 9,10。もう一度1からやり直すことはできますか?行を削除した後にID値を再利用

これを行うには、別のテーブルからデータを削除する必要がありますか?ご協力いただきありがとうございます。

+0

身元確認フィールドですか?ほとんどすべての私のテーブルのプライマリキーはIDであり、それは通常、アイデンティティフィールドです(排他的ではありません)。 – Murph

+0

はい、私はアイデンティティフィールドを意味しました。 – Jeremy

+3

これを行う方法があるからといって、あなたがすべきことではありません。 – JeffO

答えて

20

あなたはIDENTITY値を設定するには、次のように使用することができます。

DBCC CHECKIDENT (orders, RESEED, 999) 

あなたがすべてのDELETEに基づいてステートメントを実行する必要がありますを意味します。それはなぜこれが悪い考えであるのかを強調するはずです...

データベースは逐次値を気にしません。これはプレゼンテーション用です。

+0

ID 10の行を挿入する場合は、ID 9で再配置する必要があります。インクリメントが1であると仮定します。 – Gomibushi

+1

これを使用して、現在のシード値を調べることもできます。ident_current( 'table_name')をcurrent_identity – Nathan

5

identityフィールドはデフォルトで古い値を再利用しません。 dbcc checkidentで再シードすることはできますが、テーブルにまだ残っている値を再シードするとキー違反が発生するため、これは推奨されません。一般的に、あなたはPK値が何であるか気にするべきではありません。彼らが連続していないという事実は何も傷つけません。

+1

削除された値が再利用されないため、連続していないということは実際に何かを傷つけます。 32ビットのID列は最大で2^32(または負の値を除いて2^31)に制限されるため、挿入するとオーバーフローエラーが発生します。これは本質的にリソースリークの一種です。私はいくつかの計算を行い、32ビットのID列は未来のものではないと判断し、64ビットの列でさえ十分ではないかもしれません。 1年未満です。だから128ビットのGUID FTW。 – Triynko

+1

ID列としてbigintを使用すると、2^63 - 1行が得られます。それは9兆行です。 1日に1兆個のインサートでも、これはあなたが2万5千年続くでしょう。 – Aaroninus

9

すべて行は、これらの

--instead of delete, resets identity value 
TRUNCATE TABLE orders 

--or if TRUNCATE fails because of FKs, use this after DELETE 
DBCC CHECKIDENT (orders, RESEED, 1) 

のいずれかを実行を削除した後のアイデンティティをリセットしたい場合はそれ以外の場合は、内部値は、ギャップかどうかは問題ではないはずです。

関連する問題