DBCC CHECKIDENT (Transact-SQL)

更新日期: 2008 年 11 月 17 日

检查指定表的当前标识值,如有必要,则更改标识值。还可以使用 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 都返回以下信息(返回值可能有所不同):

Checking identity information: current identity value '290', current column value '290'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

更改种子值

种子值是针对装入表的第一行插入到标识列的值。所有后续行都包含当前标识值和增量值,其中当前标识值是为当前表或视图生成的最新标识值。有关详细信息,请参阅创建和修改标识符列

不能使用 DBCC CHECKIDENT 执行下列任务:

  • 更改创建表或视图时为标识列指定的原始种子值。
  • 重设表或视图中的现有行的种子值。

若要更改原始种子值并重设所有现有行的种子值,必须删除并重新创建标识列,然后为标识列指定新的种子值。当表包含数据时,还会将标识号添加到具有指定种子值和增量值的现有行中。无法保证行的更新顺序。

备注

对当前标识值所做的具体更正取决于参数规范。

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

  • 执行 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 设置为所需的起始值。

权限

调用方必须拥有此表,或是 sysadmin 固定服务器角色、db_owner 固定数据库角色或 db_ddladmin 固定数据库角色的成员。

示例

A. 根据需要重置当前标识值

以下示例根据需要重置 AdventureWorks 数据库中 Employee 表的当前标识值。

USE AdventureWorks;
GO
DBCC CHECKIDENT ("HumanResources.Employee");
GO

B. 报告当前标识值

以下示例报告 AdventureWorks 数据库的 Employee 表中的当前标识值,但如果该标识值不正确,不会进行更正。

USE AdventureWorks;
GO
DBCC CHECKIDENT ("HumanResources.Employee", NORESEED);
GO

C. 将当前标识值强制设置为 30

以下示例将 Employee 表中 EmployeeID 列中的当前标识值强制设置为值 300。由于该表具有现有行,因此插入的下一行将使用 301 作为值,即,当前标识值加 1(1 是为该列定义的当前增量值)。

USE AdventureWorks;
GO
DBCC CHECKIDENT ("HumanResources.Employee", RESEED, 30);
GO

请参阅

参考

ALTER TABLE (Transact-SQL)
CREATE TABLE (Transact-SQL)
DBCC (Transact-SQL)
IDENTITY(属性)(Transact-SQL)
USE (Transact-SQL)

其他资源

复制标识列

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

版本 历史记录

2008 年 11 月 17 日

更改的内容:
  • 更正了 new_reseed_value. 的定义
  • 在“备注”中添加了有关更改种子值的部分。

2006 年 4 月 14 日

新增内容:
  • 添加了文本用于说明有关将标识值设置为小于标识列中最大值的数字所导致的结果。
  • 在“例外”部分中添加了有关删除表中所有行的文本。

2005 年 12 月 5 日

新增内容:
  • 添加了 new_reseed_value 参数的说明文本。