列中的循环 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
(设置新种子),但它 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 千万亿的限制之前....
中阅读更多相关信息(包含所有选项)
是否可以强制 IDENTITY 列重新计算其种子 属性,当它达到已定义数据类型的最大值时,以填补 ID 中的空白。
这样说吧,我有一个 TINYINT
数据类型的列,它最多可以容纳 255 个值。当列中的数据填充到可能的最大 ID 时,我从中间删除一行,假设 ID = 100
。
问题是,我可以强制 IDENTITY
填写最后缺少的 ID 吗?
是的,你可以这样做:
set identity_insert on;
insert into table(id) value(100)
--关闭
set identity_insert off;
您 可以 重新播种 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 千万亿的限制之前....