【问题标题】:"Arithmetic overflow" error when inserting a row插入行时出现“算术溢出”错误
【发布时间】:2014-06-25 17:23:27
【问题描述】:

将 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)

【问题讨论】:

  • 请显示您的插入代码,最好是表模式。
  • 将数据类型更改为 long ?
  • 仅仅因为最大 id 是一个值并不意味着它与要分配的下一个身份有关。通过执行以下命令检查最后一个是什么:SELECT IDENT_CURRENT('table')
  • 我在网上发现了这一点 (dbforums.com/microsoft-sql-server/…),截断表并不一定会重置标识列的种子,由此产生的问题会导致这种误导性错误。该问题已通过重新播种表得到解决,但我不知道这种情况是否适用于您的情况。
  • 如果 M_ID 被定义为标识列,则根本不要插入该值。 SQL Server DB 将自动呈现下一个值。所以...insert into table (from_zip, to_zip) values ('98565', '96552')你为什么要控制数据库设置的身份值?

标签: sql sql-server ssms


【解决方案1】:

只有在下一个标识超出整数限制 2147483647 时才会看到该错误。

如 cmets 中所述,下一个身份不一定是 Max(id)+1。

可能是有人不小心把你的种子值改成了上限。

发出这个命令来检查种子值:

DBCC CHECKIDENT (tableName, NORESEED)

您应该会看到如下内容:

检查身份信息:当前身份值'110​​9',当前 列值“1109”。

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

如果返回的值不一样,可能需要重新设置身份... .

要重新播种,您可以使用以下命令将身份设置为 max(id)+1。

DBCC CHECKIDENT (tableName, RESEED)

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

DBCC CHECKIDENT (tableName, RESEED, 123456)

注意:123456 是当前种子,因此下一次插入将获得 123457。

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

【讨论】:

    【解决方案2】:

    可以查身份:

    select IDENT_CURRENT( 'table_name' )
    

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

    如果有意义,您可以将数据类型更改为 bigint 以处理更大的值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多