【发布时间】: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
假设我有一个包含两列的 MSSQL 表:一个作为标识列的 int ID 列和一些其他日期时间或任何列。假设该表有 10 条 ID 为 1-10 的记录。现在我删除 ID = 5 的记录。
是否存在其他记录会“填充”缺失 ID 的情况? IE。什么时候插入一条记录并赋予 ID 5?
【问题讨论】:
标签: sql-server sql-server-2005 identity
不,除非您特别启用标识插入(通常在复制具有标识列的表时完成)并手动插入 id 为 5 的行。SQLServer 跟踪插入到具有标识列的每个表中的最后一个标识并递增最后一个标识插入值以获取插入时的下一个值。
【讨论】:
仅当您使用 SET IDENTITY_INSERT 命令手动关闭身份 ID,然后使用 ID=5 进行插入时
否则 MS-SQL 将始终递增到更大的数字,并且永远不会重复使用丢失的插槽。
【讨论】:
尚未提及另一条记录将“填充”缺少的 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 值。
【讨论】: