0

SQL Server 2008 とその Management Studio を使用してテーブルのレコードを削除し、新しいレコードを挿入すると、主キー列の順序が正しくありません。

で Record5 を削除するとしrecord_id = 5ます。テーブルには 4 つのレコードが残りRecord1,Record2,Record3,Record4ます。

新しいレコードを挿入すると、そのID(主キー) が自動的に 6 に設定されます。SQL Server で 5 に設定する必要があります。

このテーブルを Asp.Net (c#) の gridView に表示すると変に見えるので、テーブルのrecord_id列の順序は次のようになります1, 2, 3, 17, 18, 29

見た目がとても悪いです。助けてください。

ありがとう

4

4 に答える 4

3

IDENTITY 値にギャップがないという保証はありません。実際、このようなギャップに遭遇する可能性は非常に高いです。ID 値のこのようなギャップに対応し、予想される方法でアプリケーションを設計する必要があります。グリッドに行番号を表示するには、ローカルのクライアント側 (ASP.Net またはブラウザー側の JS) カウンターを使用するのが断然最良の方法です。を使用してカウンターサーバー側を生成できますがROW_NUMBER()、クライアント側と比較して最適なオプションではありません。

于 2013-07-11T09:50:25.540 に答える
1

これは信じられないかもしれませんが、インクリメントするレコード番号が必要な場合、SQL Server はサポートしていません。ロールバックされたトランザクションまたはサーバーの再起動により、数値に穴が残る可能性があります。

厳密に増加する順序の場合、独自の実装を展開する必要があります。一般的な解決策の 1 つは、最近配布された番号のリストを含むテーブルを作成することです。アトミックな方法で数値を取得して増やすと、スレッドセーフになります。例えば:

update  NumbersTable
set     Nr = Nr + 1
output  deleted.Nr
where   Type = 'OrderNumber'

もう 1 つのオプションは、最高次数を動的に取得することです。適切なロックのヒントを使用すると、スレッドセーフな方法で実行できます。

insert  OrdersTable
        (OrderNr, col1, col2, col3)
select  isnull((
        select  max(OrderNr) + 1
        from    OrdersTable with (tablock, holdlock)
        ), 1)
,       'value1'
,       'value2'
,       'value3'

行を削除する場合は、手動で実装する必要があります。レコード 1、2、および 3 が存在するとします。レコード 2 を削除します。新しい注文の番号は何ですか? 2 と言う場合は、注文 2 が注文 3 の後に作成されることを意味することを覚えておいてください。これは多くの人を混乱させるでしょう。

于 2013-07-11T09:49:51.250 に答える
0

Delete ステートメントの後、このクエリを実行します。

declare @a int

set @a =(select max(identity_column_name) from table_name)
--print @a

dbcc checkident(table_name,reseed,@a)
于 2013-07-11T09:48:06.763 に答える