SQL Server: ID 値 (IDENTITY) をリセット (RESEED) する方法
ID 値 (IDENTITY) をリセット(RESEED)する方法
テーブルのレコード数が増えてきて、レコードを大量に削除したりした後で、ID 値 (IDENTITY) を現在のレコード数に合わせてリセットしたいような時ありませんか?
今回は、ID 値 (IDENTITY) をリセット(RESEED)する方法をご紹介します。
DBCC CHECKIDENT で ID 値を RESEED する
DBCC CHECKIDENT ステートメントで使うと、ID 値 (IDENTITY)値を確認したり、現在の ID 値を変更したりすることができます。
まず、現在の ID 値(SQL Server が持っているカウンターの値)と現在の列値(テーブルの ID 列に入っている最大の値)をチェックするスクリプトは以下の通りです。
DBCC CHECKIDENT ([テーブル名], NORESEED);
現在の ID 値と現在の列値が同じ状態が普通の状態だと思います。
次に、現在の ID 値(SQL Server が持っているカウンターの値)が現在の列値(テーブルの ID 列に入っている最大の値)より小さい場合、例えば先ほどのスクリプトでチェックした時に次のような状態になっている時です。
そんな時は次のスクリプトで現在の ID 値をリセットできます。
DBCC CHECKIDENT ([テーブル名]);
現在の ID 値が 2 から 8 に更新されていますね。
MAX の値に現在の ID 値をリセットする
最初に書いたようにレコードを削除した後には、次のようなに現在の ID 値(SQL Server が持っているカウンターの値)が現在の列値(テーブルの ID 列に入っている最大の値)より大きくなっていると思います。
この状態で先ほどの DBCC CHECKIDENT ([テーブル名]); を実行しても、現在の ID 値は更新されません。
そんな時は、次のスクリプトで値を指定して、現在の ID 値を RESEED します。
DBCC CHECKIDENT ([テーブル名], RESEED, [ID 値]);
現在の最大値に ID 値をリセットする簡単な方法は、このスクリプトで一旦 ID 値を 0 にリシードし、先ほどのスクリプトで自動的に最大値に更新させる方法です。
DBCC CHECKIDENT ([テーブル名], RESEED, 0); -- 0 にリセット DBCC CHECKIDENT ([テーブル名]); -- 最大値にリセット DBCC CHECKIDENT ([テーブル名], NORESEED); -- チェック
現在の ID 値が 8 -> 0 -> 3 のように更新されていますね。
もちろん MAX の値を自分で取得して、一回の DBCC CHECKIDENT ([テーブル名], RESEED, 最大値); で更新してしまってもかまいません。
DECLARE @MaxTestID INT = ISNULL((SELECT MAX(TestID) FROM Test), 0); DBCC CHECKIDENT ('dbo.Test', RESEED, @MaxTestID); -- 最大値にリセット DBCC CHECKIDENT ('dbo.Test', NORESEED); -- チェック
DBCC CHECKIDENT ([テーブル名], RESEED, [ID 値]) の [ID 値] は自由に設定できますが、次に生成される ID 値が既にテーブルに存在していて、そのカラムにプライマリーキーやユニーク制約がついている場合、次にレコードを挿入した時に重複のエラーになるので気をつけてください。
ちなみに、IDENTITY_INSERT を ON にして ID 値を指定してレコードをインサートした時でも、挿入した ID 値が 今までの ID の値よりも大きい場合は、現在の ID 値がその最大値で置き換えられるので、RESEED する必要はありません。