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 中自增主键的上限的主要内容,如果未能解决你的问题,请参考以下文章