SQL Server 中自增主键的上限

Posted

技术标签:

【中文标题】SQL Server 中自增主键的上限【英文标题】:Upper limit for autoincrement primary key in SQL Server 【发布时间】:2010-09-20 16:21:04 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

这是其中两个的示例:

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

我实际上已经达到了我所从事的工作的极限。实际错误是:

消息 8115,第 16 级,状态 1,第 1 行 将 IDENTITY 转换为数据类型 int 的算术溢出错误。 发生算术溢出。

我能想到几个解决方法。数字 1 可能非常困难且不太可能,数字 2 很容易,但可能会导致代码库出现问题。

    如果标识列对您来说不重要(它不是外键等),那么您只需重新设定数据库的种子并重置标识列。 将您的身份列更改为更大的数字。因此,例如,如果您溢出了一个 int,请将您的标识列更改为一个大 int。祝你好运:)

可能还有其他修复方法,但没有灵丹妙药简单的方法。我只是希望这不会发生在作为一堆关系中心的表格中,因为如果发生这种情况,您将遭受很多痛苦。这不是一个很难解决的问题,只是一个乏味而冗长的问题。

【讨论】:

如果将标识种子设置为数据类型的最小负数,则可以将列中可存储的值总数加倍。【参考方案2】:

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

【讨论】:

我正在使用 int(11) 怎么样?有多少数据?如果 auto_increment 溢出会发生什么?【参考方案3】:

我会告诉你会发生什么......我的数据停止插入到那个特定的表中。数据库仍然有效,但我发现数据丢失且不一致。经过一番研究,我找到了错误表,然后运行了手动插入。错误同上。

必须将列更改为 BIGINT。在稍慢的服务器上的 26GB 数据库上,大约需要 30 分钟。在数据库的存档版本(150GB 左右)上花费了相当长的时间。

幸运的是,这张表没有太多的关系,所以痛苦很轻微。

【讨论】:

【参考方案4】:

DBCC CHECKIDENT (SomeTable, RESEED, 1)

这会将表 'SomeTable' 上的标识重置为 1

不确定这是否是最好的方法。

【讨论】:

【参考方案5】:

数据类型说明:

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

当你达到上限时,自动增量会达到下限。

【讨论】:

以上是关于SQL Server 中自增主键的上限的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2000中如何设置自增主键?

java面试一日一题:mysql中的自增主键

mysql自增主键怎么用

mysql自增主键怎么用

mybatis记录随便保存数据获取自增主键的值

如何修改mysql主键的值为自增