2008-11-04 89 views

回答

35

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

下面是其中的两个例子:

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

其实我也在我工作的工作中达到了极限。实际的错误是:

 
    Msg 8115, Level 16, State 1, Line 1 
    Arithmetic overflow error converting IDENTITY to data type int. 
    Arithmetic overflow occurred. 

有几个修复,我可以想到我的头顶。数字1可能非常困难,不太可能,数字2很容易,但可能会导致代码库中的问题。

  1. 如果标识列对您无关紧要(它不是外键等),那么您可以重新设置数据库并重置标识列。
  2. 将您的标识列更改为更大的数字。例如,如果你溢出了一个int,把你的标识列更改为一个大的int。祝你好运溢出:)

有可能还有其他的修复,但没有灵丹妙药容易。我只希望这不会发生在一堆关系中心的桌子上,因为如果这样做的话,你会遇到很多痛苦。这不是一个难解决的问题,只是一个乏味而漫长的问题。

4

它取决于数据类型。如果你使用bigint,你不可能会溢出。即使是一个正常的int也会给你几十亿行。我从来没有溢出,所以我不能告诉你如果你这样做会发生什么。

+0

我使用int(11)那么怎么样?多少数据?以及如果auto_increment溢出会发生什么? – 2013-10-01 02:14:04

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 

当你到达上限自动递增转到下限。

2

我会告诉你发生了什么......我的数据停止插入到特定的表中。该数据库仍然有效,但我发现数据丢失和不一致。通过一些研究,我找到了错误表,然后运行了一个手动插入。错误与上述相同。不得不将该列更改为BIGINT。在一台速度较慢的服务器上的26GB数据库上,花了大约30分钟。在数据库的存档版本(150GB左右)上花了相当长的时间。

幸运的是,这张桌子没有太多的关系,所以疼痛非常轻微。

1

DBCC CHECKIDENT(SomeTable,RESEED,1)

这对表重置身份1 'SomeTable'

不知道这是要做到这一点的最好办法。