10

当 SQL Server 2005 碰巧达到 IDENTITY 列的最大值时会发生什么?它是否从头开始并开始重新填补空白?

发生这种情况时,SQL Server 2005 的行为是什么?

4

6 回答 6

14

达到最大值时会出现溢出错误。如果您使用具有最大值的 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 不提供任何功能来填补身份空白,因此您要么必须自己执行此操作,要么更改身份列的数据类型。

除此之外,您可以将起始值设置为最小的负数,以获得更大范围的值来使用。

这是一篇关于这个主题的好博文

于 2008-11-04T15:18:12.803 回答
1

它不会填补空白。相反,插入将失败,直到您更改列的定义以删除标识并找到其他填充空白的方法或增加大小(从 int 到 bigint)或更改数据类型(从 int 到 decimal ) 以便有更多的标识值可用。

于 2008-11-04T15:19:30.943 回答
1

在解决问题之前,您将无法插入新行并且会收到上面列出的错误消息。您可以通过多种方式做到这一点。如果您仍然有数据并且正在使用低于最大值的所有 id,则必须更改数据类型。如果定期清除数据并且您有很大的空白将不会被使用,您可以将标识号重新设置为该空白中的最低数字。例如,在之前的工作中,我们正在记录事务。我们每月可能有 40-5000 万,但我们正在清除所有超过 6 个月的东西,所以每隔几年,身份将接近 20 亿,但我们将没有任何 id 低于 15 亿的东西,所以我们会重新播种回到 0。同样有可能这些都不适合你,你必须找到不同的解决方案。

于 2008-11-04T15:51:14.547 回答
0

如果标识列是整数,那么您的最大值为 2,147,483,647。如果超过它,您将收到溢出错误。

如果您认为这是一种风险,只需使用 BIGINT 数据类型,它最多可以提供 9,223,372,036,854,775,807。无法想象有这么多行的数据库表。

在这里进一步讨论。(与提到的 xsl 链接相同)。

于 2008-11-04T15:22:45.290 回答
0

如果您确实达到了标识列的最大数量,您可以将该表中的数据移动到具有更大标识列类型的辅助表中,并将该新标识值的起始值指定为前一个标识值的最大值类型。新的身份值将从那时开始继续。

于 2008-11-04T16:36:59.010 回答
0

如果您不时删除“旧值”,您只需使用 DBCC CHECKIDENT ('MyTable', RESEED, 0) 重置种子;

于 2009-08-21T14:28:02.350 回答