将 IDENTITY 转换为数据类型 int 时出现算术溢出错误。

IDENTITY标识列为int类型,取值范围为-2^32到2^31-1。当增长值超过这个最大值时,我在SQL Server 2008 R2 x64上试验的结果是:

将 IDENTITY 转换为数据类型 int 时出现算术溢出错误。
  • 一般解决方案:
1,)如果该column为主键,则删除主键:
alter table [tablename] drop [pkname];
2,)修改该column的数据类型为bigint:
alter table [tablename] alter column [column name] bigint;
这种方案的操作步骤:
  1. )将[tablename] 表中的记录插入到临时表,
  2. )之后清掉[tablename] 中的记录,
  3. )修改[column name] 的数据类型,
  4. ) 从临时表中的记录插回表[tablename],释放临时表。
这种方案会产生大量日志。
 
  • 手动处理方案:
  1. )自己新建一种表[tablename_new] ,设定[column name] bigint
  2. )将[tablename]中的记录插入到表[tablename_new];
  3. )删除表[tablename],修改表[tablename_new]名称为[tablename]。
 
 
备注:

int、bigint、smallint 和 tinyint

使用整数数据的精确数字数据类型。

bigint

从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)。存储大小为 8 个字节。

int

从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字)。存储大小为 4 个字节。int 的 SQL-92 同义字为 integer

smallint

从 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型数据。存储大小为 2 个字节。

tinyint

从 0 到 255 的整型数据。存储大小为 1 字节。

注释

在支持整数值的地方支持 bigint 数据类型。但是,bigint 用于某些特殊的情况,当整数值超过 int 数据类型支持的范围时,就可以采用 bigint。在 SQL Server 中,int 数据类型是主要的整数数据类型。

在数据类型优先次序表中,bigint 位于 smallmoneyint 之间。

只有当参数表达式是 bigint 数据类型时,函数才返回 bigint。SQL Server 不会自动将其它整数数据类型(tinyintsmallintint)提升为 bigint

上一篇:将 expression 转换为数据类型 int 时发生算术溢出


下一篇:关于c中 int, float, double转换中存在的精度损失问题