適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Microsoft Fabric SQL Database
SQL Server の指定されたテーブルの現在の ID 値をチェックし、必要に応じて ID 値を変更します。 ID 列の新しい現在の ID 値を手動で設定する場合に DBCC CHECKIDENT を使用することもできます。
この記事とIDENTITY構文は、SQL データベース エンジンのプラットフォームによって異なります。 Microsoft Fabric Data Warehouseについては、バージョンのドロップダウンリストからFabric Data Warehouseを選択してください。
構文
Syntax for SQL Server、Azure SQL Database、Azure SQL Managed Instance、SQL database in Fabric:
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 ]
引数
table_name
現在の ID 値をチェックするテーブルの名前です。 指定されたテーブルには同一列が含まれていなければなりません。 テーブル名は識別子の規則に従っている必要があります。
Person.AddressTypeや[Person].[AddressType]のような2部または3部名には区切り符を使いましょう。
NORESEED
現在の ID 値を変更しないように指定します。
RESEED
現在の ID 値を変更するように指定します。
new_reseed_value
ID 列の現在の値として使用する新しい値です。
NO_INFOMSGS付き
すべての情報メッセージを表示しないようにします。
解説
DBCC CHECKIDENTが現在の恒等式値に対して行う具体的な修正は、パラメータの仕様によって異なります。
DBCC CHECKIDENT コマンド |
ID の修正または加えられた修正 |
|---|---|
DBCC CHECKIDENT (<table_name>, NORESEED) |
現在の ID 値がリセットされていません。
DBCC CHECKIDENT は、ID 列の現在の ID 値と現在の最大値を返します。 もし2つの値が同じでない場合は、値の列に誤りや隙間ができないように単位元値をリセットしてください。 |
DBCC CHECKIDENT (<table_name>)or DBCC CHECKIDENT (<table_name>, RESEED) |
テーブルの現在の識別値が識別列に保存されている最大識別値より小さい場合、 DBCC CHECKIDENT は識別列の最大値を用いてリセットします。 後の「例外」セクションを参照してください。 |
DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) |
現在の ID 値は new_reseed_value に設定されます。 テーブル作成以降に行が挿入されていないか、 TRUNCATE TABLE 文ですべての行が削除された場合、 DBCC CHECKIDENT 実行後に挿入される最初の行は new_reseed_value を識別子として使います。 テーブルに行がある場合、または DELETE 文ですべての行が削除された場合、次に挿入される行は new_reseed_value + 現在のインクリメント 値を使用します。 トランザクションが行を挿入し、その後ロールバックした場合、次に挿入される行は new_reseed_value + 現在のインクリメント 値を使い、その行が削除されたかのように扱います。 テーブルが空でない場合、ID 値に ID 列の最大値より小さな値を設定すると、次の状況のいずれかが発生する可能性があります。- 単位列に PRIMARY KEY または UNIQUE 制約が存在する場合、生成された単位元値が既存の値と矛盾するため、後の挿入操作でエラーメッセージ2627が生成されます。- PRIMARY KEY または UNIQUE 制約が存在しない場合、後の挿入操作で同一性の重複値が生じます。 |
例外
次の表に、DBCC CHECKIDENT で現在の ID 値が自動的にリセットされないときの条件と、値をリセットする方法を示します。
| 条件 | リセット方法 |
|---|---|
| 現在の ID 値がテーブルの最大値より大きい。 |
DBCC CHECKIDENT (<table_name>, NORESEED) を実行して、列の現在の最大値を確認します。 次に、 コマンドでその値を DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) として指定します。or DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) を低い値に設定して new_reseed_value を実行した後、DBCC CHECKIDENT (<table_name>, RESEED) を実行して値を修正します。 |
| すべての行がテーブルから削除されている。 |
DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) を新しい開始値に設定して 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 値をリセットする
以下の例は、必要に応じてデータベース内の指定されたテーブルの現在の同一性値をリセットします。
USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType');
GO
B. 現在の ID 値を報告する
以下の例は、指定されたテーブルの現在の識別値を報告し、誤った場合は訂正しません。
USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType', NORESEED);
GO
C. 現在の ID 値を強制的に新しい値に設定する
以下の例は、AddressTypeテーブルのAddressTypeID列の現在の恒等式値を10に強制します。 テーブルには既存の行があるため、次に挿入される行は11を値として使います。 列に1を加えた新しい現在の恒等式は、その列のインクリメント値です。
USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);
GO
D. 空のテーブルの ID 値をリセットする
以下の例では、テーブルの識別子が(1, 1)を仮定し、ErrorLogテーブルのErrorLogID列の現在の単位元値を、テーブルからすべてのレコードを削除した後の値を1に強制します。 テーブルには既存の行がないため、次に挿入される行は1を値として使います。 TRUNCATE後に定義されたインクリメント値を加えず、DELETE後にインクリメント値を加算しない新しい現在の同一性値。
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
関連するコンテンツ
テーブルの単位元値をFabric Data Warehouseで再シードします。
SET IDENTITY_INSERTで明示的な値を挿入した後にDBCC CHECKIDENTを用いて、識別範囲を再調整し、将来の自動生成値との競合を防ぎます。
この記事とIDENTITY構文は、SQL データベース エンジンのプラットフォームによって異なります。
構文
DBCC CHECKIDENT ( 'table_name' [ , RESEED ] )
引数
table_name
識別値の再シードを行うテーブルの名前。 テーブルには識別列が含まれなければなりません。 テーブル名には 'dbo.DimCustomer' や '[dbo].[DimCustomer]'などのスキーマ名を含めることができます。
RESEED
RESEEDキーワードは任意ですが、DBCC CHECKIDENTは常に再シード操作を実行します。 オプションを入れても省いても同じ結果になります。
RESEEDキーワードは、使用済みおよび予約済みの識別範囲をすべてスキャンし、既存の値との競合を避けるために次の識別値を設定するようデータベース エンジンに指示します。 Fabric Data Warehouseでは、RESEEDがすべての分散計算ノードでレンジ認識スキャンを行い、正しい次の値を決定します。
解説
- Fabric Data Warehouseにおいて、
DBCC CHECKIDENTが支持する唯一の議論はRESEEDオプションであり、常にそれを実行します。 システムは既存のデータに基づいて正しい次の識別値の範囲を自動的に決定します。 カスタムの再シード値を指定することはできません。 -
IDENTITY_INSERTを使って明示的な値を挿入した後は、必ずDBCC CHECKIDENTを実行してください。 この操作により、今後自動生成される値が手動で挿入された値と衝突しないようにします。 - Fabric Data Warehouseでは、カスタム
new_reseed_valueを指定することはサポートされていません。 値を提供しようとすると、以下のエラーが返されます:Specifying a custom seed in Fabric Data Warehouse is not supported. -
DBCC CHECKIDENTDMLとDDLの同時操作をブロックできるロックを取得します。 混乱を最小限に抑えるために、他のプロセスがテーブルをアクティブに使っていない時はコマンドを単独で実行してください。
アクセス許可
テーブルの所有者か、テーブル ALTER 許可が必要です。
例
A. センチネル値を挿入した後の再シード
センチネル値を次元テーブルに SET IDENTITY_INSERTで埋め込んだ後、識別子列を再シードして、今後自動生成される値が手動挿入された値と衝突しないようにします。
-- Insert sentinel values
SET IDENTITY_INSERT dbo.DimCustomer ON;
INSERT INTO dbo.DimCustomer (CustomerKey, CustomerName)
VALUES (-1, 'Unknown'),
(-2, 'Not Applicable');
SET IDENTITY_INSERT dbo.DimCustomer OFF;
-- Reseed to realign future identity values
DBCC CHECKIDENT('dbo.DimCustomer', RESEED);
B. バルク移動後の再播種
明示的な識別値を持つ過去のデータを移行した後、テーブルを再シードして新しい行が移行データと重複しない値を受け取るようにします。
-- After migrating data with IDENTITY_INSERT
DBCC CHECKIDENT('dbo.DimProduct', RESEED);
-- Future inserts receive auto-generated values beyond the migrated range
INSERT INTO dbo.DimProduct (ProductName, Category)
VALUES ('New Widget', 'Hardware');
C. COPY INTO後に再シード IDENTITY_INSERT
COPY INTOでデータを読み込んだ後、IDENTITY_INSERTがON中で、識別カラムを再シードします。
COPY INTO オプションは IDENTITY_INSERTのセッションレベル設定を上書きします。
COPY INTO dbo.DimStore (StoreKey 1, StoreName 2, Region 3)
FROM 'https://storage.blob.core.windows.net/migration/dimstore.csv'
WITH (
FILE_TYPE = 'CSV',
IDENTITY_INSERT = 'ON'
);
-- Reseed after bulk load
DBCC CHECKIDENT('dbo.DimStore', RESEED);
D. RESEEDキーワードなしで再シード
RESEEDキーワードは任意ですが、DBCC CHECKIDENTは常に再シード操作を実行します。 オプションを入れても省いても同じ結果になります。
-- Reseed without the RESEED keyword
DBCC CHECKIDENT('dbo.DimStore');
-- Reseed with the RESEED keyword
DBCC CHECKIDENT('dbo.DimStore', RESEED);