列中的循环 IDENTITY 编号

Circular IDENTITY numbers in column

是否可以强制 IDENTITY 列重新计算其种子 属性,当它达到已定义数据类型的最大值时,以填补 ID 中的空白。

这样说吧,我有一个 TINYINT 数据类型的列,它最多可以容纳 255 个值。当列中的数据填充到可能的最大 ID 时,我从中间删除一行,假设 ID = 100

问题是,我可以强制 IDENTITY 填写最后缺少的 ID 吗?

是的,你可以这样做:

set identity_insert on;
insert into table(id) value(100)

--关闭

set identity_insert off;

Identity Insert

可以 重新播种 IDENTITY(设置新种子),但它 NOT 能够神奇地找到缺失值.....

重新设置种子的 IDENTITY 列将继续从新种子开始分发新值 - 这意味着,在某个时候,迟早会发生与现有值的冲突

因此,总而言之,重新播种 IDENTITY 确实不是一个好主意....只需选择一个足够大的数据类型来满足您的需求。

对于类型 INT,从 1 开始,您会得到 超过 20 亿 可能的行 - 这对于绝大多数情况来说应该绰绰有余。使用 BIGINT,你得到大约 922 千万亿 (922 有 15 个零 - 9'220'00000000000000000000000000000000000000000000000000000000000)922 922 数字数字的 92222222222)

如果您使用从 1 开始的 INT IDENTITY,并且您 每秒插入一行 ,则需要 66.5 在你达到 20 亿上限之前....

如果您使用从 1 开始的 BIGINT IDENTITY,并且您 每秒插入一千行 ,您需要令人难以置信的 2.92 亿年 在你达到 922 千万亿的限制之前....

MSDN Books Online.

中阅读更多相关信息(包含所有选项)