web-dev-qa-db-ja.com

削除後にSQL Serverの自動インクリメントをリセットする

SQL Serverデータベースのテーブルからレコードをいくつか削除しました。これでIDは101から1200になりました。レコードをもう一度削除したいのですが、IDを102に戻したいのですが。これをSQL Serverで行う方法はありますか?

231
jumbojs

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

DBCC CHECKIDENT (mytable, RESEED, 0)

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

407
Robert Wagner
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)

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

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


いくつかの追加情報...あなたに役立つかもしれません

上記のクエリで自動インクリメントnumberを指定する前に、既存のテーブルの自動インクリメント列にnumberより小さい値が含まれていることを確認する必要があります。

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

 SELECT MAX(column_name) FROM table1
79
Fathah Rehman P

セミばか防止:

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

34
user423430

これを試して:

ALTER TABLE tablename AUTO_INCREMENT = 1
9
xaa

データベース内のすべてのテーブルを削除してシードします。

    USE [DatabaseName]
    EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"       -- Disable All the constraints
    EXEC sp_MSForEachTable "DELETE FROM ?"    -- Delete All the Table data
    Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)' -- Reseed All the table to 0
    Exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"  -- Enable All  the constraints back

-- You may ignore the errors that shows the table without Auto increment field.
6
BMG

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

 DBCC CHECKIDENT ('tablename', RESEED, newseed)
6
jumbojs

完全なスキーマ資格で、同様の問題に遭遇した人々のために、受け入れられた答えに基づいて:

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

つまり、以下はエラーになります。

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

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

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

いくつかの回答では、次のような文を使用することをお勧めします。

DBCC CHECKIDENT (mytable, RESEED, 0)

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

DBCC CHECKIDENT (mytable)

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

より良い解決策はこれらのアイデアを組み合わせたものです。テーブルにレコードがある場合、最初のCHECKIDENTは値を0にリセットし、2番目のチェックポイントは現在テーブルにある最大値にリセットします。

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

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

3
Michael Rodby

あなたはこれを一般的にしたくありません。シードはデータの完全性の問題を引き起こす可能性があります。それは本当にあなたがすべてのテストデータを一掃して最初からやり直している開発システムでの使用のためだけのものです。すべての関連レコードが削除されていない場合(外部キー関係にあるべきすべてのテーブルが削除されているわけではありません!)、本番システムでは使用しないでください。あなたはこれをすることで混乱を作成することができます、そして、あなたがすべての削除の後に定期的にそれをすることを意味するなら特に。アイデンティティーフィールド値のギャップを心配するのは悪い考えです。

2
HLGEM

テーブルにスキーマを使用するとDBCC CHECKIDENT-アプローチで問題が発生するため、この回答を追加します。確かにこれを使ってください。

DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);

操作の成功を確認したい場合は、

SELECT IDENT_CURRENT(@Table);

上記の例では0を出力するはずです。

2

これはどうですか?

ALTER TABLE `table_name`
  MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;

これは、自動インクリメントを0または任意の数値に変更するための迅速で簡単な方法です。私はデータベースをエクスポートして自分でコードを読むことによってこれを考え出しました。

これを1行のソリューションにするために、このように書くこともできます。

ALTER TABLE `table_name` MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;
0
Victor Resnov