3

データベースに使用Microsoft SQL Serverしています。

テーブルに ID 列があります。私の使用法では、行が何度も削除され、再作成されます。そこで、SQL Server の Identity Increment と Identity Seed を使用すると、しばらくすると ID 番号が非常に大きくなります...

すべての新しい行が他の行よりも大きい ID を持つことは重要ではありません。ただそれはユニークでなければなりません。

SQL Serverでそれを行う方法は? 自動インクリメントを無効にして ID を手動で設定する必要がありますか? どうやって?

C# と SQL Server Express を使用しています。

4

3 に答える 3

7

数値が大きいか小さいかを気にする理由はわかりませんが (ユーザーが感傷的な価値を持たないか、ID 値に何らかの意味を持たないことを願っています)、枯渇の問題を回避する 1 つの方法は、BIGINT を使用することです。正確な数は忘れましたが、1 秒間に 1000 個の ID を生成すると、制限に達するまでに 80 年ほどかかります。負の境界から開始すると、これを 2 倍にすることができます。はい、BIGINT は 4 バイトではなく 8 バイトですが、それでも GUID よりもはるかに小さく、使いやすいです。これをデータ圧縮と組み合わせると、20 億の数値を使用するまで、INT 以外のストレージは必要ありません。

これを過度に設計しないでください。また、アイデンティティ値のサイズまたは値が何かを意味するはずであるという間違いを犯さないでください。これは、内部識別と効率化のみを目的として生成された代理値です。この値についてユーザーに伝えている場合、何かが正しくありません。

于 2012-06-25T13:09:07.687 に答える
1

多くのことをいじりたくない場合、つまり、select Max(ID) または next_ID を含むテーブルを使用して、ストアド プロシージャに物を追加するだけで、マルチユーザー アクセスなどに対処したい場合を除き、2005 年にはこれに固執しています (SQL 2012年にシーケンスが導入されたようです)。

他のオプションは、ID の番号を付け直して ID を再シードすることですが、それも大変な作業です。

大きな数は問題ではなく、小さな数と同じように 4 バイトしか使用しません。ロールオーバーはもちろん問題ですが、それには時間がかかります。

スケーリングするGUIDに切り替えることもできますが、非常に非効率的なインデックスになるため、2 ^ 31を超えるレコードを作成しない限り、これだけでは価値がありません.

他の誰かが言ったように、Bigint はより広い範囲を提供しますが、もちろんさらに大きな数を提供します。:(

于 2012-06-25T13:01:17.360 に答える
1

このコードで試すことができます

-- ID を無効にする SET IDENTITY_INSERT YourSchema.YourTable OFF GO

于 2012-06-25T12:58:38.527 に答える