2014-06-25 51 views
0

将IDENTITY转换为数据类型int的算术溢出错误。插入一行时出现“算术溢出”错误

当试图将记录插入到具有656128行的表中时,出现此错误。我在这个表中的最大ID是1186183.这看起来不像是会导致这个错误的数字。 ID列是int类型,不是null。身份,身份增量和身份种子都是如此。

关于可能导致此问题的任何想法?

insert into table (m_id, from_zip, to_zip) 
values (7788, '98565', '96552') 

schema 
id (int, not null) 
m_id (int null) 
from_zip (nvarchar(50), null) 
to_zip (nvarchar(50), null) 
+0

请显示您的插入代码,最好是表格模式。 – JiggsJedi

+0

将数据类型更改为long? – StrawHara

+2

仅仅因为最大id是一个值并不意味着与下一个要分配的身份有关。通过执行这个来检查最后一个是什么:SELECT IDENT_CURRENT('table') – nickles80

回答

2

该错误只应被视为下一个身份是超越2​​147483647

整数限制正如评论指出,以处理更大的价值,下一个身份不一定是Max(id)+1。

这可能是有人无意中将您的种子值无意中改变了上限。

发出以下命令来检查种子值:

DBCC CHECKIDENT (tableName, NORESEED)

您应该看到这样的事情:

检查标识信息:当前标识值 '1109',当前 列值“ 1109' 。

DBCC执行完成。如果DBCC打印错误 消息,请联系您的系统管理员。

如果返回的值不相同,它可能会付出重新种子的身份...如果返回的第一个值在极限,这就是为什么你会得到错误,而你肯定需要重新种植。

重新种子你会使用以下设置标识为最大(id)+1。

DBCC CHECKIDENT (tableName, RESEED)

如果要指定下一个种子值,你可以使用:

DBCC CHECKIDENT (tableName, RESEED, 123456)

NB:123456是当前的种子,所以接下来的插入会得到123457.

请在重新播种之前阅读此msdn article,并了解可能对您的业务和数据产生的影响。

1

可以检查身份:

select IDENT_CURRENT('table_name') 

如果要删除和插入数据时,标识值将继续增加。截断将重置表格的标识。

您可以更改的数据类型为bigint如果是有道理的