分享方式:


DBCC CHECKIDENT (Transact-SQL)

適用於:SQL ServerAzure 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 + current increment 值,如同資料列已遭到刪除。 如果資料表不是空的,則將識別值設定為小於識別欄位中最大值的數字,可能會導致下列其中一種狀況:

- 如果識別欄位有 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 都會針對所有作業傳回下列訊息 (只有一個例外)。 該作業會指定新的初始值。

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

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

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

權限

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

Azure Synapse Analytics 需要 db_owner 權限。

範例

A. 必要的話,重設目前的識別值

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

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

B. 報告目前的識別值

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

USE AdventureWorks2022;
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),並會在刪除資料表中所有記錄之後,強制將 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

另請參閱