310

SQL Server データベースのテーブルからいくつかのレコードを削除しました。

テーブル内の ID は次のようになります。

99 100 101 1200 1201...

後のレコード (ID > 1200) を削除したいのですが、自動インクリメントをリセットして、次の自動生成された ID が 102 になるようにします。私のレコードは連続しています。SQL Server でこれを行う方法はありますか?

4

13 に答える 13

521

次のコマンドを発行して、mytable を再シードして 1 から開始します。

DBCC CHECKIDENT (mytable, RESEED, 0)

これについては、Books on Line (BOL、SQL ヘルプ) を参照してください。また、設定しているシードよりも高いレコードがないように注意してください。

于 2009-02-04T05:05:24.347 に答える
102
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)

number=0 の場合、次の挿入では自動インクリメント フィールドに値 1 が含まれます。

number=101 の場合、次の挿入では、自動インクリメント フィールドに値 102 が含まれます。


追加情報...役に立つかもしれません上記のクエリで

自動インクリメントを指定する前に、既存のテーブルの自動インクリメント列に含まれる値が 未満であることを確認する必要があります。numbernumber

テーブル(table1)から列(column_name)の最大値を取得するには、次のクエリを使用できます

 SELECT MAX(column_name) FROM table1
于 2012-06-20T08:09:11.120 に答える
46

半馬鹿防止:

declare @max int;  
select @max = max(key) from table;  
dbcc checkident(table,reseed,@max)

http://sqlserverplanet.com/tsql/using-dbcc-checkident-to-reseed-a-table-after-delete

于 2012-05-01T18:31:28.263 に答える
9

私はそれを考え出した。これは:

 DBCC CHECKIDENT ('tablename', RESEED, newseed)
于 2009-02-04T05:12:06.067 に答える
6

いくつかの回答では、次のようなステートメントを使用することをお勧めします。

DBCC CHECKIDENT (mytable, RESEED, 0)

しかし、OPは「一部のレコードを削除しました」と述べましたが、これはすべてではない可能性があるため、値0が常に正しいとは限りません。別の回答では、現在の最大値を自動的に見つけてその値に再シードすることが提案されましたが、テーブルにレコードがない場合は問題が発生するため、 max() は NULL を返します。単に使用することを提案したコメント

DBCC CHECKIDENT (mytable)

値をリセットしますが、別のコメントは、これは値をテーブル内の既存の最大値まで増加させるだけであると正しく述べています。OPがやりたかったことである、テーブルの最大値よりもすでに高い場合、これは値を減らしません。

より優れたソリューションは、これらのアイデアを組み合わせたものです。テーブルにレコードがある場合、最初の CHECKIDENT は値を 0 にリセットし、2 番目は現在テーブルにある最大値にリセットします。

DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)

複数のコメントが示しているように、削除されたレコードを指す他のテーブルに外部キーがないことを確認してください。そうしないと、これらの外部キーは、テーブルを再シードした後に作成したレコードを指します。

于 2017-04-02T20:59:58.163 に答える
6

受け入れられた回答に基づいて、同様の問題に遭遇した人のために、完全なスキーマ修飾を使用して:

( [MyDataBase].[MySchemaName].[MyTable])... エラーになります。その DB のコンテキストにいる必要があります。

つまり、次の場合はエラーがスローされます。

DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)

代わりに、完全修飾テーブル名を一重引用符で囲みます。

DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
于 2016-04-07T12:58:01.087 に答える