【问题标题】:Reseed identity column to 0 fails - current identity value is NULL将标识列重新设置为 0 失败 - 当前标识值为 NULL
【发布时间】:2014-01-04 10:20:52
【问题描述】:

我使用恢复数据库并删除 my_table 中的记录

 delete from my_table;

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

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

我得到的信息是:

检查身份信息:当前身份值“NULL”,当前列值“0”。

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

DBCC CHECKIDENT ('my_table', NORESEED); 

我收到了这条消息:

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

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

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

【问题讨论】:

  • 你解决了吗?我有同样的问题,但没有成功解决。

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


【解决方案1】:

改为:

truncate table my_table;

这将自动重置标识列。 (另外,它会比使用delete 删除行更快)

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

参考:Truncate Table

【讨论】:

  • 问题是我的表中有FK,所以截断表不是很好的解决方案。
  • FK 以同样的方式受到删除的影响。除非你当然打开了删除级联,这是非常糟糕的做法,IMO。
  • 不幸的是,我已打开删除级联。
  • 如果我重新设置为 1,我得到了相同的消息(当前身份为空,当前值为空)。但是当我插入一条记录时,它的标识值为 1 而不是 0。
  • 这是一个包含我们想要保留的现有记录的表??
【解决方案2】:

您无法使用单个命令设置/重置标识列来涵盖表是否已插入记录的两种情况,这似乎很荒谬。在我偶然发现上面关于 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

【讨论】:

    猜你喜欢
    • 2014-08-13
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    相关资源
    最近更新 更多