1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
使用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 |