【问题标题】:Question about skipping IDs in an identity column in MSSQL关于在MSSQL的标识列中跳过ID的问题
【发布时间】:2008-10-22 21:44:16
【问题描述】:

假设我有一个包含两列的 MSSQL 表:一个作为标识列的 int ID 列和一些其他日期时间或任何列。假设该表有 10 条 ID 为 1-10 的记录。现在我删除 ID = 5 的记录。

是否存在其他记录会“填充”缺失 ID 的情况? IE。什么时候插入一条记录并赋予 ID 5?

【问题讨论】:

    标签: sql-server sql-server-2005 identity


    【解决方案1】:

    不,除非您特别启用标识插入(通常在复制具有标识列的表时完成)并手动插入 id 为 5 的行。SQLServer 跟踪插入到具有标识列的每个表中的最后一个标识并递增最后一个标识插入值以获取插入时的下一个值。

    【讨论】:

      【解决方案2】:

      仅当您使用 SET IDENTITY_INSERT 命令手动关闭身份 ID,然后使用 ID=5 进行插入时

      否则 MS-SQL 将始终递增到更大的数字,并且永远不会重复使用丢失的插槽。

      【讨论】:

        【解决方案3】:

        尚未提及另一条记录将“填充”缺少的 IDENTITY 值的一种情况是重新播种 IDENTITY。示例(SQL Server 2008):

        CREATE TABLE Test 
        (
           ID INTEGER IDENTITY(1, 1) NOT NULL, 
           data_col INTEGER NOT NULL
        );
        
        INSERT INTO Test (data_col) 
           VALUES (1), (2), (3), (4);
        
        DELETE
          FROM Test 
         WHERE ID BETWEEN 2 AND 3;
        
        DBCC CHECKIDENT ('Test', RESEED, 1)
        
        INSERT INTO Test (data_col) 
           VALUES (5), (6), (7), (8);
        
        SELECT T1.ID, T1.data_col 
          FROM Test AS T1
         ORDER 
            BY data_col;
        

        结果是:

        ID  data_col
        1   1
        4   4
        2   5
        3   6
        4   7
        5   8
        

        这表明,不仅“洞”被新的自动生成的值填充,在重新播种之前自动生成的值被重新使用,甚至可以复制现有的 IDENTITY 值。

        【讨论】:

          猜你喜欢
          • 2016-02-27
          • 2011-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多