首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >DBCC CHECKIDENT将标识设置为0

DBCC CHECKIDENT将标识设置为0
EN

Stack Overflow用户
提问于 2009-01-23 11:17:30
回答 10查看 126.4K关注 0票数 82

我正在使用这个代码来重置一个表上的标识:

代码语言:javascript
复制
DBCC CHECKIDENT('TableName', RESEED, 0)

这在大多数情况下都很好用,在第一次插入时,我将1插入到Id列中。但是,如果我删除DB并重新创建它(使用我编写的脚本),然后调用DBCC CHECKIDENT,则插入的第一个项的ID将为0。

有什么想法吗?

EDIT:在研究之后,我发现我没有正确读取documentation -“当前标识值被设置为new_reseed_value。如果表自创建以来没有插入任何行,则执行DBCC CHECKIDENT后插入的第一行将使用new_reseed_value作为标识。否则,插入的下一行将使用new_reseed_value + 1。”

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-01-23 13:15:48

正如您在问题中指出的,它是一个documented behavior。不过,我还是觉得很奇怪。我使用来重新填充测试数据库,即使我不依赖于标识字段的值,但在第一次从头开始填充数据库时以及在删除所有数据并再次填充之后,具有不同的值是有点恼人的。

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

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

票数 26
EN

Stack Overflow用户

发布于 2012-11-09 14:50:02

您在问题的编辑中所写的内容是正确的。

在运行DBCC CHECKIDENT('TableName', RESEED, 0)之后

  • 新创建的表将以identity 0
  • 现有表将以identity 1

开始

解决方案在下面的脚本中,它是一种糟糕的截断:)

代码语言:javascript
复制
-- 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);
票数 73
EN

Stack Overflow用户

发布于 2017-09-13 23:48:10

您不能用一条命令来设置/重置标识列,以涵盖表是否已插入记录的两种情况,这似乎很荒谬。我不能理解我正在经历的行为,直到我在SO上偶然发现了这个问题!

我的解决方案(虽然难看,但很有效)是显式地检查sys.identity_columns.last_value表(它会告诉您表中是否插入了记录),并在每种情况下调用适当的DBCC CHECKIDENT命令。具体如下:

代码语言:javascript
复制
DECLARE @last_value INT = CONVERT(INT, (SELECT last_value FROM sys.identity_columns WHERE OBJECT_NAME(OBJECT_ID) = 'MyTable'));
IF @last_value IS NULL
    BEGIN
        -- Table newly created and no rows inserted yet; start the IDs off from 1
        DBCC CHECKIDENT ('MyTable', RESEED, 1);
    END
ELSE
    BEGIN
        -- Table has rows; ensure the IDs continue from the last ID used
        DECLARE @lastValUsed INT = (SELECT ISNULL(MAX(ID),0) FROM MyTable);
        DBCC CHECKIDENT ('MyTable', RESEED, @lastValUsed);
    END
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/472578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档