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

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

?
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