使用DBCC CHECKIDENT来查看和纠正IDENTITY种子值
在这个技巧中,我会介绍如何使用DBCC CHECKIDENT命令来为表检查列的IDENTITY值。DBCC CHECKIDENT检查某表当前最大的值。这个命令的语法如下:
- DBCC CHECKIDENT
- ( 'table_name' [ , {NORESEED | { RESEED [ , new_reseed_value ] }}])
- [ WITH NO_INFOMSGS ]
表4-10详细描述了此命令的参数。
表4-10 CHECKIDENT参数
参数 |
描述 |
table_name |
这个参数表示要对其IDENTITY 值进行检查的表名 |
NORESEED | RESEED |
NORESEED代表仅仅是汇报当前最 大的标识值。RESEED指定当前的 IDENTITY应该为什么值 |
new_reseed_value |
这个参数指定新的当前的IDENTITY值 |
WITH NO_INFOMSGS |
如果在命令中包含WITH NO_INFOMSGS, 则它禁止DBCC输出信息性消息 |
在这个示例中,我们检查表当前的IDENTITY值:
- DBCC CHECKIDENT('HumanResources.CompanyAuditHistory', NORESEED)
这个查询返回:
检查标识信息:当前标识值'2',当前列值'2'。
DBCC执行完毕。如果DBCC输出了错误信息,请与系统管理员联系。
第二个示例把种子值重设为一个更大的数字:
- DBCC CHECKIDENT ('HumanResources.CompanyAuditHistory', RESEED, 50)
这个查询返回:
检查标识信息:当前标识值'2',当前列值'50'。
DBCC执行完毕。如果DBCC输出了错误信息,请与系统管理员联系。
解析
第一个示例演示了使用DBCC CHECKIDENT和NO RESEED选项检查当前的IDENTITY值。第二个示例演示了真正把IDENTITY值设置成更大的值。将来的任何插入都会从这个值开始。
为什么作这样的修改呢?带RESEED的DBCC CHECKIDENT通常用于填补主键的缺口。如果你从表中删除了一些行,这些行的IDENTITY列具有最大值,那么用过的标识值不会在下次记录插入到表中的时候重用。例如,如果上次插入的行值是22,而且你删除了那行,那么接下去插入的行值会是23。那是因为值删除之后SQL Server不会填补这个空隙。如果你希望重用键值(通常在数据库的测试阶段可以这样做,但是在正式环境下你千万别重用主键值),可以在大量行删除后使用DBCC CHECKIDENT来重用数字。