DBCC CHECKIDENT将标识设置为0

use*_*437 69 sql sql-server

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

DBCC CHECKIDENT('TableName', RESEED, 0)
Run Code Online (Sandbox Code Playgroud)

这在大多数情况下工作正常,第一个插入我将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.

Zyp*_*rax 62

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

运行后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);
Run Code Online (Sandbox Code Playgroud)

  • 很好,但是在处理多个模式时,您可能需要稍微调整一下以匹配“object_id”,而不是使用“OBJECT_NAME()”来查找表的名称:“IF EXISTS (SELECT * FROM sys.identity_columns WHERE object_id = OBJECT_ID('Schema.TableName') AND last_value IS NOT NULL`) (3认同)

kri*_*tof 24

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

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

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

  • 该链接似乎已经死了,目前的文档https://msdn.microsoft.com/en-us/library/ms176057.aspx表示,这只是2012年之前版本的预期行为,但似乎不是true(测试2012版,兼容性设置为2012,仍然存在问题). (2认同)

dma*_*kic 5

将语句更改为

  DBCC CHECKIDENT('TableName', RESEED, 1)
Run Code Online (Sandbox Code Playgroud)

这将从 2 开始(或者当您重新创建表时从 1 开始),但它永远不会是 0。


Mat*_*ise 5

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

我的解决方案(丑陋但有效)是显式检查sys.identity_columns.last_value表(它告诉您该表是否插入了记录)并DBCC CHECKIDENT在每种情况下调用适当的命令。如下:

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
Run Code Online (Sandbox Code Playgroud)