DBCC CHECKIDENT (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

SQL Server の指定されたテーブルの現在の ID 値をチェックし、必要に応じて ID 値を変更します。 ID 列の新しい現在の ID 値を手動で設定する場合に DBCC CHECKIDENT を使用することもできます。

Transact-SQL 構文表記規則

構文

SQL Server と Azure SQL Database の構文:

DBCC CHECKIDENT
 (
    table_name
        [ , { NORESEED | { RESEED [ , new_reseed_value ] } } ]
)
[ WITH NO_INFOMSGS ]

Azure Synapse Analytics の構文:

DBCC CHECKIDENT
 (
    table_name
        [ RESEED , new_reseed_value ]
)
[ WITH NO_INFOMSGS ]

注意

SQL Server 2014 以前の Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

table_name

現在の ID 値をチェックするテーブルの名前です。 指定されたテーブルには、ID 列が含まれている必要があります。 テーブル名は識別子の規則に従っている必要があります。 2 部または 3 部構成の名前は、Person.AddressType[Person].[AddressType] のように区切る必要があります。

NORESEED

現在の ID 値を変更しないように指定します。

RESEED

現在の ID 値を変更するように指定します。

new_reseed_value

ID 列の現在の値として使用する新しい値です。

WITH NO_INFOMSGS

すべての情報メッセージを表示しないようにします。

解説

現在の ID 値に加えられる特定の修正は、指定されているパラメーターによって異なります。

DBCC CHECKIDENT コマンド ID の修正または加えられた修正
DBCC CHECKIDENT (<table_name>, NORESEED) 現在の ID 値がリセットされていません。 DBCC CHECKIDENT は、ID 列の現在の ID 値と現在の最大値を返します。 2 つの値が異なる場合は、エラーが発生しないよう、または連続値の一部が欠落しないように、ID 値をリセットする必要があります。
DBCC CHECKIDENT (<table_name>)

or

DBCC CHECKIDENT (<table_name>, RESEED)
テーブルの現在の ID 値が、ID 列に格納されている最大の ID 値より小さい場合、テーブルの現在の ID 値は ID 列の最大値にリセットされます。 後の「例外」セクションを参照してください。
DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) 現在の ID 値は new_reseed_value に設定されます。 テーブルの作成以降に行が挿入されていない場合、または TRUNCATE TABLE ステートメントによってすべての行が削除されている場合、DBCC CHECKIDENT の実行後に挿入される最初の行の ID には new_reseed_value が使用されます。 テーブルに行が存在する場合、または DELETE ステートメントを使用してすべての行が削除された場合は、挿入される次の行に new_reseed_value + 現在の増分の値が使用されます。 トランザクションによって行が挿入され、後でそのトランザクションがロールバックされた場合、挿入される次の行では、new_reseed_value + 現在の増分の値が、行が削除されたかのように使用されます。 テーブルが空でない場合、ID 値に ID 列の最大値より小さな値を設定すると、次の状況のいずれかが発生する可能性があります。

- ID 列に PRIMARY KEY 制約または UNIQUE 制約が設定されている場合、生成される ID 値と既存の値との競合が原因で、テーブルに対する後続の挿入操作でエラー メッセージ 2627 が生成されます。

- PRIMARY KEY 制約または UNIQUE 制約がない場合、後続の挿入操作では重複した ID 値が生成されます。

例外

次の表に、DBCC CHECKIDENT で現在の ID 値が自動的にリセットされないときの条件と、値をリセットする方法を示します。

条件 リセット方法
現在の ID 値がテーブルの最大値より大きい。 DBCC CHECKIDENT (<table_name>, NORESEED) を実行して、列の現在の最大値を確認します。 次に、DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) コマンドでその値を new_reseed_value として指定します。

or

new_reseed_value を低い値に設定して DBCC CHECKIDENT (<table_name>, RESEED,<new_reseed_value>) を実行した後、DBCC CHECKIDENT (<table_name>, RESEED) を実行して値を修正します。
すべての行がテーブルから削除されている。 new_reseed_value を新しい開始値に設定して DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) を実行します。

シード値を変更する

シード値は、テーブルに読み込まれる最初の行の ID 列に挿入される値です。 以降の行にはすべて、現在の ID 値 (テーブルまたはビューに対して生成された最後の ID 値) に増分値を加えた値が格納されます。

以下のタスクに DBCC CHECKIDENT を使うことはできません。

  • テーブルまたはビューの作成時に ID 列に指定された、元のシード値を変更する。

  • テーブルまたはビュー内の既存の行にシード値を再生成する。

元のシード値を変更したり、任意の既存の行にシード値を再生成したりするには、ID 列を削除し、新しいシード値を指定して作り直す必要があります。 テーブルにデータが含まれている場合、ID 番号が、指定のシード値および増分値を使用して既存の行に追加されます。 行の更新順序は保証されません。

結果セット

ID 列を含むテーブルに対してオプションを指定するかどうかにかかわらず、DBCC CHECKIDENT は、ある操作以外のすべての操作に対して次のメッセージを返します。 それは、新しいシード値を指定する操作です。

ID 情報を調べています。現在の ID 値 '<現在の ID 値>'、現在の列値 '<現在の列値>'。 DBCC の実行が完了しました。 DBCC がエラー メッセージを出力した場合は、システム管理者に相談してください。

DBCC CHECKIDENT を使い、RESEED <new_reseed_value> を使用して新しいシード値を指定する場合、次のメッセージが返されます。

ID 情報を調べています。現在の ID 値 '<現在の ID 値>'。 DBCC の実行が完了しました。 DBCC がエラー メッセージを出力した場合は、システム管理者に相談してください。

アクセス許可

呼び出し元がテーブルを含むスキーマを所有しているか、sysadmin 固定サーバー ロール、db_owner 固定サーバー ロール、または db_ddladmin 固定サーバー ロールのメンバーである必要があります。

Azure Synapse Analytics には、db_owner アクセス許可が必要です。

A. 必要に応じて現在の ID 値をリセットする

次の例では、必要に応じて、AdventureWorks2022 データベース内の指定されたテーブルの現在の ID 値をリセットします。

USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType');
GO

B. 現在の ID 値を報告する

次の例では、AdventureWorks2022 データベース内の指定されたテーブルの現在の ID 値を報告します。ID 値が正しくない場合でも、ID 値の修正は行いません。

USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType', NORESEED);
GO

C. 現在の ID 値を強制的に新しい値に設定する

次の例では、 AddressType テーブルの AddressTypeID 列の現在の ID 値を強制的に 10 に設定します。 テーブルには既存の行があるため、挿入される次の行には値として 11 が使用されます。 列に定義された新しい現在の ID 値に 1 (列の増分値) を加えた値です。

USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);
GO

D. 空のテーブルの ID 値をリセットする

次の例では、テーブル ID (1, 1) を仮定し、テーブルのすべてのレコードを削除した後に、ErrorLog テーブルの ErrorLogID 列の現在の ID 値を強制的に 1 に設定します。 テーブルには既存の行がないため、次に挿入される行では値に 1 が使用されます。つまり、TRUNCATE 後に列について定義された増分値を加えたり、DELETE 後に増分値を加えたり "しない"、新しい現在の ID 値です。

USE AdventureWorks2022;
GO
TRUNCATE TABLE dbo.ErrorLog
GO
DBCC CHECKIDENT ('dbo.ErrorLog', RESEED, 1);
GO
DELETE FROM dbo.ErrorLog
GO
DBCC CHECKIDENT ('dbo.ErrorLog', RESEED, 0);
GO

関連項目