DBCC CHECKIDENT (Transact-SQL)

在 SQL Server 2012 中檢查指定之資料表目前的識別值,必要的話,會變更識別值。 您也可以使用 DBCC CHECKIDENT,手動設定識別欄位的新目前識別值。

主題連結圖示 Transact-SQL 語法慣例

語法

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

引數

  • table_name
    這是要檢查目前識別值之資料表的名稱。 指定的資料表必須包含識別欄位。 資料表名稱必須符合識別碼的規則。

  • 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 當做識別。 否則,下一個插入的資料列便會使用 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。

  • 將 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)。

變更初始值

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

您無法使用 DBCC CHECKIDENT 來執行下列工作:

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

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

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

結果集

不論是否針對包含識別欄位的資料表指定任何選項,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.

當使用 DBCC CHECKIDENT 來透過 RESEED new_reseed_value 指定新的初始值時,將會傳回下列訊息。

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 固定資料庫角色的成員。

範例

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

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

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

B.報告目前的識別值

下列範例會報告 AdventureWorks2012 資料庫中指定之資料表目前的識別值,如果識別值不正確,並不會更正它。

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

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

下列範例會強制將 AddressType 資料表中 AddressTypeID 資料行內的目前識別值設定為 10。 因為資料表目前有資料列,所以下一個插入的資料列將會使用 11 的值,也就是針對資料行值定義的目前增量值加 1。

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

請參閱

參考

ALTER TABLE (Transact-SQL)

CREATE TABLE (Transact-SQL)

DBCC (Transact-SQL)

IDENTITY (屬性) (Transact-SQL)

USE (Transact-SQL)

IDENT_SEED (Transact-SQL)

IDENT_INCR (Transact-SQL)

概念

複寫識別欄位