4

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

是否有任何情况下另一条记录将“填写”缺少的 ID?即什么时候会插入一条记录并给定一个ID 5?

4

3 回答 3

7

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

于 2008-10-22T21:50:00.097 回答
2

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

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

于 2008-10-22T21:56:21.580 回答
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 值。

于 2008-10-23T09:21:36.003 回答