【问题标题】:Does reset primary keys with DBCC CHECKIDENT safe for rows with bigger Id是否使用 DBCC CHECKIDENT 对 ID 较大的行安全地重置主键
【发布时间】:2016-10-29 00:52:34
【问题描述】:

我有一个带有主整数键值的表,并且它的自动递增一个一个,里面的值一直很好,直到 116,突然之后它从 10085 值继续......

我不知道为什么,但也许我做了一个收缩数据库。但无论如何我都知道 DBCC CHECKIDENT 命令。

我的问题是,如果我运行 DBCC CHECKIDENT (mytable, RESEED, 116) ,它是否会损害我将来 ID 为 100085 的行? 我的意思是当有一天我的行数达到 100084 时,sql server 会从其他 Id 跳转还是会抛出异常以插入重复 Id?

【问题讨论】:

    标签: sql sql-server tsql primary-key dbcc


    【解决方案1】:

    不建议使用以下命令

    DBCC CHECKIDENT (mytable, RESEED, 116) 
    

    因为当你的行数达到 100084 时它会抛出异常

    欲了解更多信息,请阅读以下Topic。它说建议从表中删除所有行。如果您想使用 DBCC CHECKIDENT 重新播种表

    【讨论】:

      【解决方案2】:

      不要这样做

      一旦标识列达到 100084 就会抛出重复键异常。

      它不会神奇地跳过以前生成的值以避免冲突。您可以从下面轻松看到这一点

      CREATE TABLE mytable
        (
           x INT IDENTITY PRIMARY KEY,
           Y INT
        )
      
      INSERT INTO mytable
                  (Y)
      SELECT TOP (200) number
      FROM   master..spt_values
      
      DELETE FROM mytable
      WHERE  x BETWEEN 1 AND 150;
      
      DBCC CHECKIDENT (mytable, RESEED, 1)
      
      /*Works OK*/
      INSERT INTO mytable
                  (Y)
      SELECT TOP (149) number
      FROM   master..spt_values
      
      /*Error*/
      INSERT INTO mytable
                  (Y)
      SELECT TOP (10) number
      FROM   master..spt_values 
      

      消息 2627,级别 14,状态 1,第 25 行违反主键 约束“PK__mytable__3BD019E5518439DD”。不能插入重复 键入对象“dbo.mytable”。重复键值为 (151)。这 语句已终止。

      【讨论】:

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