SQL Server数据库表重置自增主键号(通常是指ID)

使用DBCC CHECKIDENT可以重新设置在使用中的表的标识列的起始值;
如在删除表中的所有记录,需要让标识列从1开始时可以在查询分析器中执行:DBCC CHECKIDENT(TableName,RESEED,0);该语句的使用方法如下:DBCC CHECKIDENT

检查指定表的当前标识值,如有必要,还对标识值进行更正。
语法

DBCC CHECKIDENT
( 'table_name'
[,{ NORESEED
| { RESEED [,new_reseed_value] }
}
]
)
参数

'table_name'

是要对其当前标识值进行检查的表名。表名必须符合标识符规则。有关更多信息,请参见使用标识符。指定的表必须包含标识列。

NORESEED

指定不应更正当前标识值。

RESEED

指定应该更正当前标识值。

new_reseed_value

是在标识列中重新赋值时要使用的值。
备注

如有必要,DBCC CHECKIDENT 会更正列的当前标识值。然而,如果标识列是使用 NOT FOR REPLICATION 子句(在 CREATE TABLE 或 ALTER TABLE 语句中)创建的,则不更正当前标识值。

如果标识列上有主键或唯一键约束,无效标识信息可能会导致错误信息 2627。

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

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 并不自动重置当前标识值。若要在当前标识值大于列中的最大值时对当前标识值进行重置,请使用两种方法中的任意一种:

    执行 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 并不自动重置当前标识值。若要在删除表中所有行时对当前标识值进行重置,请使用下面这种方法:

    执行 DBCC CHECKIDENT (table_name,RESEED,new_reseed_value),并将new_reseed_value设置为所需的起始值。

 
结果集

无论是否为包含标识列的表指定了任何选项,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 权限默认授予表所有者、sysadmin固定服务器角色和db_owner固定数据库角色的成员且不可转让。
示例A. 根据需要重置当前标识值

以下示例根据需要重置 AdventureWorks 数据库中 Employee 表的当前标识值。
USE AdventureWorks;
GO
DBCC CHECKIDENT ("HumanResources.Employee");
GOB. 报告当前标识值

以下示例报告 AdventureWorks 数据库的 Employee 表中的当前标识值,但如果该标识值不正确,不会进行更正。
USE AdventureWorks;
GO
DBCC CHECKIDENT ("HumanResources.Employee", NORESEED);
GOC. 将当前标识值强制设置为 30

以下示例将 Employee 表中 EmployeeID 列中的当前标识值强制设置为值 30。由于该表具有现有行,因此插入的下一行将使用 31 作为值,即,当前标识值加 1(1 是为该列定义的当前增量值)。
USE AdventureWorks;
GO
DBCC CHECKIDENT ("HumanResources.Employee", RESEED, 30);
GO

 

posted @ 2014-05-02 15:00  i Traveling Light  阅读(1718)  评论(0编辑  收藏  举报