DBCC CHECKIDENT (Transact-SQL)

適用範圍: 是SQL Server (所有支援的版本) 是Azure SQL Database 是Azure SQL 受控執行個體 是Azure Synapse Analytics

在 SQL Server 2019 (15.x) 中檢查指定資料表目前的識別值,必要的話,請變更識別值。 您也可以使用 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
這是要檢查目前識別值之資料表的名稱。 指定的資料表必須包含識別欄位。 資料表名稱必須遵照識別碼的規則。 兩個或三個部分的名稱必須加以分隔,例如 '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

-或-

new_reseed_value 設定為非常低的值,並執行 DBCC CHECKIDENT (table_name, RESEED,new_reseed_value),然後執行 DBCC CHECKIDENT (table_name, RESEED) 以更正此值。
資料表中的所有資料列都遭到刪除。 執行 DBCC CHECKIDENT (table_name, RESEED,new_reseed_value),並將 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 固定資料庫角色的成員。

Azure Synapse Analytics 需要 db_owner 權限。

範例

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

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

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

B. 報告目前的識別值

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

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

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

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

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

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

下列範例會在刪除資料表中所有記錄後,強制將 ErrorLog 資料表中 ErrorLogID 資料行內的目前識別值設定為 1。 因為資料表沒有現有的資料列,所以下一個插入的資料列將會使用 1 作為值,也就是目前的識別值,而不新增針對資料行定義的遞增值。

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 (屬性) (Transact-SQL)
複寫識別資料行
USE (Transact-SQL)
IDENT_SEED (Transact-SQL)
IDENT_INCR (Transact-SQL)