SQL Server中自增主键的上限是多少?

36

SQL Server的自增主键上限是多少?当SQL Server自增主键达到上限时会发生什么?

5个回答

39

乔尔的答案是正确的,它是您使用的任何数据类型的上限。

以下是两个示例:

  • int: 2 ^ 31-1(2,147,483,647)
  • bigint:2 ^ 63-1(9,223,372,036,854,775,807)

我曾经在工作中遇到过此限制。 实际错误为:

     Msg 8115,级别16,状态1,行1
     转换IDENTITY为数据类型int时发生算术溢出错误。
     发生算术溢出。


我可以想到一些解决方法。 其中方案1可能非常困难,不太可能实现;方案2很容易,但可能会导致代码库出现问题。

  1. 如果标识列对您没有意义(它不是外键等),则可以重新设置数据库并重置标识列。
  2. 将标识列更改为更大的数字。 因此,例如,如果已经溢出int,则将标识列更改为bigint。 祝您溢出成功 :)

可能还有其他解决方法,但没有魔法子弹的简单方法。 我只希望这不会发生在一张涉及许多关系的表格中,因为如果是这样,您将面临很多痛苦。 这不是一个难以解决的问题,只是一个漫长而乏味的问题。


如果您将数据类型的标识种子设置为最低负数,则可以将列中可存储的值的总数增加一倍。 - ESS

4

这取决于数据类型。如果你使用bigint,你很难溢出。即使是普通的int也能提供几十亿行。我从来没有溢出过,所以无法告诉你如果溢出会发生什么。


我正在使用int(11),这怎么样?有多少数据?如果自动增量溢出会发生什么? - Josua Marcel C

2
我告诉你发生了什么...我的数据停止插入到特定的表中。数据库仍然可以工作,但我发现数据丢失和不一致。通过一些研究,我找到了错误表,然后进行了手动插入。错误与上述相同。
必须将列更改为BIGINT。在一个26GB的数据库上,在一个相对较慢的服务器上,大约需要30分钟。在数据库的归档版本(大约150GB)上,需要更长时间。
幸运的是,这个表的关系不太多,所以痛苦相当轻微。

1

DBCC CHECKIDENT (SomeTable, RESEED, 1)

这将重置表“SomeTable”的标识为1

不确定这是否是最佳方法。


0

数据类型描述:

BIGINT    Integer data from -2^63 through 2^63 - 1

INT       Integer data from -2^31 through 2^31 - 1

SMALLINT  Integer data from -2^15 through 2^15 - 1

TINYINT   Integer data from 0     through 255

当达到上限时,自增会回到下限。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接