有关在MSSQL中的标识列中跳过ID的问题

时间:2008-10-22 21:44:17

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

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

是否存在其他记录会“填写”缺少ID的情况?即何时插入记录并给出5的ID?

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

其他记录将“填写”缺少的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值。