当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);

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top