在SQL 2005中,当自动编号列的数量用完时会发生什么?
-
06-07-2019 - |
题
当SQL Server 2005达到IDENTITY列的最大值时会发生什么?它是从一开始就开始重新填补空白吗?
SQL Server 2005发生时的行为是什么?
解决方案
达到最大值时会出现溢出错误。如果使用bigint数据类型,其最大值为 9,223,372,036,854,775,807
,则很可能永远不会出现这种情况。
您将收到的错误消息如下所示:
Msg 220, Level 16, State 2, Line 10
Arithmetic overflow error for data type tinyint, value = 256.
据我所知,MS SQL没有提供填充身份空白的功能,因此您必须自己执行此操作或更改标识列的数据类型。
除此之外,您还可以将起始值设置为最小的负数,以获得更大范围的值。
其他提示
它不会填补空白。相反,插入将失败,直到您更改列的定义为删除标识并找到填补空白或增加大小(从int到bigint)或更改数据类型(从int到decimal)的其他方式)以便获得更多的身份值。
在修复问题之前,您将无法插入新行并将收到上面列出的错误消息。你可以通过多种方式实现这一目标。如果您仍然拥有数据并使用最大值以下的所有ID,则必须更改数据类型。如果数据定期被清除,并且您有一个不会被使用的大间隙,则可以将标识号重新设置为该间隙中的最小数字。例如,在以前的工作中,我们记录了交易。我们每个月可能有4千万到5千万,但是我们正在清除超过6个月的所有东西,所以每隔几年,这个身份将接近20亿,但我们没有任何ID低于15亿,所以我们会重新调整回到0.再次,这些都不适合你,你必须找到一个不同的解决方案。
如果标识列是整数,则最大值为2,147,483,647。如果超过它,您将收到溢出错误。
如果您认为这是一个风险,只需使用BIGINT数据类型,它最多可以提供9,223,372,036,854,775,807。无法想象具有那么多行的数据库表。
进一步讨论此处。 (与xsl提到的链接相同)。
如果您确实达到了标识列的最大编号,则可以将该表中的数据移动到具有更大标识列类型的辅助表中,并将该新标识值的起始值指定为最大值以前的类型。从那一点开始,新的身份值将继续存在。
如果删除“旧值”,你不时需要重置种子 DBCC CHECKIDENT('MyTable',RESEED,0);