DBCC CHECKIDENT (Transact-SQL)

適用対象: はいSQL Server (サポートされているすべてのバージョン) はいAzure SQL データベース はいAzure SQL Managed Instance はいAzure Synapse Analytics

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

記事リンク アイコン Transact-SQL 構文表記規則

構文

-- Syntax for SQL Server and Azure SQL Database  

DBCC CHECKIDENT
 (
    table_name  
        [, { NORESEED | { RESEED [, new_reseed_value ] } } ]  
)  
[ WITH NO_INFOMSGS ]  
-- Syntax for Azure Synapse Analytics
DBCC CHECKIDENT   
 (   
    table_name  
        [RESEED, new_reseed_value ]   
)  
[ WITH NO_INFOMSGS ]  

注意

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

引数

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

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 値をリセットする方法を示します。

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

- または -

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 は、ある操作以外のすべての操作に対して次のメッセージを返します。 それは、新しいシード値を指定する操作です。

Checking identity information: current identity value '\<current identity value>', current column value '\<current column value>'. DBCC execution completed. If DBCC printed error messages, contact your system administrator.

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

Checking identity information: current identity value '\<current identity value>'. DBCC execution completed. If DBCC printed error messages, contact your system administrator.

アクセス許可

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

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

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

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

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

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

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

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

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

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

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

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

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

USE AdventureWorks2012;  
GO  
TRUNCATE TABLE dbo.ErrorLog
GO
DBCC CHECKIDENT ('dbo.ErrorLog', RESEED, 1);  
GO  

参照

ALTER TABLE (Transact-SQL)
CREATE TABLE (Transact-SQL)
DBCC (Transact-SQL)
IDENTITY (Property) (Transact-SQL)
ID 列のレプリケート
USE (Transact-SQL)
IDENT_SEED (Transact-SQL)
IDENT_INCR (Transact-SQL)