DBCC CHECKIDENT (Transact-SQL)

適用于: SQL Server Azure SQL DatabaseAzure SQL 受控執行個體Azure Synapse Analytics

檢查SQL Server中指定資料表的目前識別值,並視需要變更識別值。 您也可以使用 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

要檢查目前識別值的資料表名稱。 指定的資料表必須包含識別欄位。 資料表名稱必須遵照識別碼的規則。 必須分隔兩或三個部分名稱,例如 Person.AddressType[Person].[AddressType]

NORESEED

指定不應變更目前的識別值。

RESEED

指定應變更目前的識別值。

new_reseed_value

要作為識別資料行目前值的新值。

WITH NO_INFOMSGS

隱藏所有參考訊息。

備註

目前識別值的特定更正會隨著參數規格而不同。

DBCC CHECKIDENT 命令 進行的識別更正
DBCC CHECKIDENT (<table_name>, NORESEED) 不重設目前的識別值。 DBCC CHECKIDENT 會傳回目前識別值和識別資料行目前的最大值。 如果這兩個值不同,則應該重設識別值以防止值序列中發生錯誤或出現間距。
DBCC CHECKIDENT (<table_name>)



DBCC CHECKIDENT (<table_name>, RESEED)
如果資料表目前的識別值小於識別欄位所儲存的最大識別值,就會利用識別欄位中的最大值來重設它。 請參閱後續的 例外狀況 一節。
DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) 目前的識別值會設定為 new_reseed_value 。 如果在建立資料表之後未插入任何資料列,或是已使用 TRUNCATE TABLE 語句移除所有資料列,則執行 DBCC CHECKIDENT new_reseed_value 之後所插入的第一個資料列會使用 作為身分識別。 如果資料表中有資料列,或是已使用 DELETE 子句移除所有資料列,則插入的下一個資料列會使用 new_reseed_value + 目前的遞增 值。 如果交易插入資料列,且稍後回復,插入的下一個資料列會使用 new_reseed_value + 目前的遞增 值,就像已刪除資料列一樣。 如果資料表不是空的,則將識別值設定為小於識別欄位中最大值的數字,可能會導致下列其中一種狀況:

- 如果識別資料行上有 PRIMARY KEY 或 UNIQUE 條件約束,錯誤訊息 2627 會在稍後插入資料表時產生,因為產生的識別值會與現有的值衝突。

- 如果 PRIMARY KEY 或 UNIQUE 條件約束不存在,稍後的插入作業將會導致重複的識別值。

例外狀況

下表列出 DBCC CHECKIDENT 何時不會自動重設目前身分識別值的條件,並提供重設值的方法。

條件 重設方法
目前的識別值大於資料表中的最大值。 執行 DBCC CHECKIDENT (<table_name>, NORESEED) 以判斷資料行中的目前最大值。 接下來,將該值指定為命令中的 DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>)new_reseed_value



執行 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 設定為新的起始值。

變更種子值

初始值就是針對載入資料表的第一個資料列插入到識別欄位中的值。 所有後續資料列都會包含目前的識別值加上遞增值,其中目前的識別值就是針對資料表或檢視表所產生的最後一個識別值。

您無法 DBCC CHECKIDENT 將 用於下列工作:

  • 變更建立資料表或檢視時針對識別欄位所指定的原始初始值。

  • 重設資料表或檢視表中現有的資料列。

若要變更原始初始值並重設任何現有的資料列,請卸除識別欄位並指定新的初始值來重建此識別欄位。 當資料表包含資料時,識別數字就會加入至含有指定初始值和遞增值的現有資料列。 但是,無法保證資料列的更新順序。

結果集

不論您是否為包含識別欄位的資料表指定任何選項, DBCC CHECKIDENT 都會針對除了一個以外的所有作業傳回下列訊息。 該作業會指定新的初始值。

檢查身分識別資訊:目前的識別值 ' < current identity value > ',目前的資料行值 ' < current column value > '。 DBCC 的執行已經完成。 如果 DBCC 印出錯誤訊息,請連絡您的系統管理員。

DBCC CHECKIDENT使用 來指定新的種子值時 RESEED <new_reseed_value> ,會傳回下列訊息。

檢查身分識別資訊:目前的身分識別值 ' < current identity value > '。 DBCC 的執行已經完成。 如果 DBCC 印出錯誤訊息,請連絡您的系統管理員。

權限

呼叫者必須擁有包含資料表的結構描述,或者必須是 sysadmin 固定伺服器角色、db_owner 固定資料庫角色,或 db_ddladmin 固定資料庫角色的成員。

Azure Synapse Analytics 需要db_owner許可權。

範例

A. 視需要重設目前的身分識別值

在必要時,下列範例會重設 AdventureWorks2019 資料庫中指定資料表目前的識別值。

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

B. 報告目前的識別值

下列範例會報告 AdventureWorks2019 資料庫中指定資料表目前的識別值,且如果識別值不正確則不會更正該值。

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

C. 將目前的識別值強制為新的值

下列範例會強制將 AddressTypeID 資料表中 AddressType 資料行內的目前識別值設定為 10。 因為資料表有現有的資料列,所以插入的下一個資料列會使用 11 做為值。 為數據行定義的新目前識別值加上 1 個 (,這是資料行的遞增值) 。

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

D. 重設空白資料表上的識別值

下列範例假設 的資料表識別, (1, 1) 並在從資料表中刪除所有記錄之後,強制資料表中資料行中的 ErrorLogIDErrorLog 目前識別值設為 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

另請參閱