【问题标题】:DBCC CHECKIDENT(myTable, RESEED,1) reseeding from 2DBCC CHECKIDENT(myTable, RESEED,1) 从 2 重新播种
【发布时间】:2017-08-10 15:53:27
【问题描述】:

在 SQL Server 2012 中,以下查询将标识列 myTable_id 从 2 而不是 1 作为种子。为什么? myTable_id也是PK。

DELETE FROM myTable;
GO
SELECT * FROM myTable --0 rows are returned as expected
GO
DBCC CHECKIDENT(myTable, RESEED,1)
GO
INSERT INTO myTable(col1,col2,col3) SELECT FROM AnotherTable(col1,col2,col3)
GO
SELECT * FROM myTable --1005 rows are returned as expected, but identity value starts from 2
GO

备注

  1. 插入的数据是对的,唯一的问题是新插入的数据是从2而不是1开始的。
  2. 在上面的 sql 代码中,如果我使用DBCC CHECKIDENT(myTable, RESEED,0),标识列正确地从 1 开始。
  3. 以下是 SSMS 中myTable_id 列的快照:

【问题讨论】:

  • DBCC CHECKIDENT(myTable, RESEED,0)
  • 我可以想象,因为重新设置为 1 意味着它认为它已经有一个值 1,所以下一个应该是 2。即在这种情况下它是基于零的,而不是基于 1 的可能更多给定身份的默认行为,直观

标签: sql-server tsql sql-server-2012 dbcc


【解决方案1】:

来自docs

种子值是插入到标识列中的值,用于加载到表中的第一行。所有后续行都包含当前标识值加上增量值,其中当前标识值是为表或视图生成的最后一个标识值。

因此,如果您从 10 开始播种,则要插入的下一个值将是 11。

【讨论】:

  • 这很令人困惑,因为如果表是truncated,它将从 10 开始,而不是 11:“如果自创建表以来没有向表中插入任何行,或者如果所有行已使用 TRUNCATE TABLE 语句删除,运行 DBCC CHECKIDENT 后插入的第一行使用 new_reseed_value 作为标识。"
  • @DavidG。是的,但是如果当前值没有(如上面的代码所示),下一个插入的值应该是 1,对吗?因为,您文档中的示例 C 表示如果当前值为 10,则下一个插入的值为 11。我可能在这里误解了什么?
  • DBCC CHECKIDENT(myTable, RESEED,1) 将“当前值”设置为 1。
  • @Blorgbeard 我同意你关于混淆的第一条评论——这正是我决定发布这个问题的原因。
  • @nam 但是你在这里没有使用TRUNCATE,所以有什么困惑?
【解决方案2】:

这里的答案没有什么不好,但困惑来自微软的方法本身。

我认为:

DBCC CHECKIDENT(myTable, RESEED, 0)

应该在所有地方都有相同的行为:

  1. 在新创建的表上,
  2. 删除表记录后,
  3. 截断表格后

否则我们需要在运行之前检查表状态。

【讨论】:

    【解决方案3】:

    按预期工作另请参阅
    https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-checkident-transact-sql#examples

    值 1 表示当前标识将从 1 开始,下一个标识将从 2 开始

    要从 1 开始,您应该这样做

    DBCC CHECKIDENT(myTable, RESEED, 0)
    

    【讨论】:

    • 请看我上面的cmets。
    • 你还指的是什么cmets?
    • 我在@Blorgbeard的评论之后的第一条评论。
    • 您自己也在此评论中说过。如果你用 10 重新播种,那么下一个标识值将是 11。那么这里有什么混淆?这正是我要说的
    • 我现在看到我的答案实际上与DavidG的答案相同
    【解决方案4】:

    这对我有用:

      DBCC CHECKIDENT ([Table], RESEED, 0)
      DBCC CHECKIDENT ([Table], RESEED)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      • 2010-10-21
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      相关资源
      最近更新 更多