当前位置:  开发笔记 > 数据库 > 正文

DBCC CHECKIDENT将标识设置为0

如何解决《DBCCCHECKIDENT将标识设置为0》经验,为你挑选了2个好方法。

我正在使用此代码重置表上的标识:

DBCC CHECKIDENT('TableName', RESEED, 0)

这在大多数情况下工作正常,第一个插入我将1插入Id列.但是,如果我删除数据库并重新创建它(使用我编写的脚本)然后调用DBCC CHECKIDENT,则插入的第一个项目的ID将为0.

有任何想法吗?

编辑:经过研究我发现我没有正确阅读文档:http: //msdn.microsoft.com/en-us/library/aa258817(SQL.80).aspx - "当前标识值设置为new_reseed_value.如果自创建以来没有向表插入任何行,则在执行DBCC CHECKIDENT后插入的第一行将使用new_reseed_value作为标识.否则,插入的下一行将使用new_reseed_value + 1.



1> Zyphrax..:

你在编辑问题时写的是正确的.

运行后DBCC CHECKIDENT('TableName', RESEED, 0):
- 新创建的表将以标识0开头
- 现有表将继续标识1

解决方案在下面的脚本中,它有点像一个穷人 - 截断:)

-- Remove all records from the Table
DELETE FROM TableName

-- Use sys.identity_columns to see if there was a last known identity value
-- for the Table. If there was one, the Table is not new and needs a reset
IF EXISTS (SELECT * FROM sys.identity_columns WHERE OBJECT_NAME(OBJECT_ID) = 'TableName' AND last_value IS NOT NULL) 
    DBCC CHECKIDENT (TableName, RESEED, 0);



2> kristof..:

正如您在问题中指出的那样,这是一种记录在案的行为.我仍觉得很奇怪.我用来重新填充测试数据库,即使我不依赖于身份字段的值,在第一次从头开始填充数据库时以及在删除所有数据并再次填充之后,使用不同的值会有点烦人.

一种可能的解决方案是使用truncate来清理表而不是删除.但是,您需要删除所有约束并在之后重新创建它们

以这种方式,它始终表现为新创建的表,并且不需要调用DBCC CHECKIDENT.第一个标识值将是表定义中指定的值,无论您是第一次插入数据还是第N次插入数据,它都是相同的


该链接似乎已经死了,目前的文档https://msdn.microsoft.com/en-us/library/ms176057.aspx表示,这只是2012年之前版本的预期行为,但似乎不是true(测试2012版,兼容性设置为2012,仍然存在问题).
推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有