Reseed identity列为0失败 - 当前标识值为NULL

时间:2014-01-04 10:20:53

标签: sql sql-server-2008 identity-column

我使用

恢复数据库并删除my_table中的记录
 delete from my_table;

然后我使用此查询重新设置了表标识列:

DBCC CHECKIDENT('dbo.my_table', reseed, 0);

我得到的信息是:

  

检查身份信息:当前标识值'NULL',当前列值'0'。

但是,当我使用此查询检查当前身份时:

DBCC CHECKIDENT ('my_table', NORESEED); 

我收到了这条消息:

  

检查身份信息:当前标识值'NULL',当前列值'NULL'。

所以,当我在表中插入记录时,第一次插入会给我一个错误,但如果我再试一次,那么插入成功。

为什么我无法将当前标识列值设置为0?我需要先在表中插入标识值为1。

2 个答案:

答案 0 :(得分:2)

相反,请使用:

truncate table my_table;

将自动重置标识列。 (另外,它比使用delete

删除行更快
  

如果表包含标识列,则为该列的计数器   重置为为列定义的种子值。如果没有种子   已定义,使用默认值1。要保留身份信息柜台,   改为使用DELETE。

参考:Truncate Table

答案 1 :(得分:1)

使用单个命令无法设置/重置标识列以涵盖表是否已插入记录的情况,这似乎很荒谬。在我偶然发现上面的问题之前,我无法理解我所经历的行为!

我的解决方案 - 丑陋但有效 - 是显式检查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