none
自增列 到最大值 的问题 RRS feed

  • 问题

  • 假如有个表的自增列的值达到了最大后,会出现什么状况?下一个值是什么?
    CREATE TABLE [dbo].[RunInfo](
     [RunID] [bigint] IDENTITY(1,1) NOT NULL,
     [GatherTime] [datetime] NULL,
     [Temperature] [real] NULL
    )
    RunID从1开始自增,1,2,3.。。。允许的最大值
    到最大值后会出现什么状况?

    yuxianye
    2010年1月6日 3:20

答案

  • Can't insert row anymore, have to reseed the column.
    • 已标记为答案 yuxianye 2010年1月6日 9:00
    2010年1月6日 3:23
  • Your table has more than 9,223,372,036,854,775,807 rows?
    • 已标记为答案 yuxianye 2010年1月6日 9:00
    2010年1月6日 3:58
  • 超过最大值的结果是收到错误 8115 , 看后面的测试
    CREATE TABLE #t(
    	id tinyint IDENTITY(255, 1),
    	col int
    );
    INSERT #t VALUES(1);
    INSERT #t VALUES(1);
    
    DROP TABLE #t
    
    /*-- 结果
    (1 row(s) affected)
    Msg 8115, Level 16, State 1, Line 6
    Arithmetic overflow error converting IDENTITY to data type tinyint.
    Arithmetic overflow occurred.
    --*/
    • 已标记为答案 yuxianye 2010年1月6日 9:00
    2010年1月6日 4:07
  • Can't insert row anymore, have to reseed the column.

    重新设置列后,如果再从1开始,RunID就会有重复,原来的数据不能删除。
    请问怎么办?


    yuxianye

    这个 SQL Server 没有办法自动解决, 只能自己想办法, 比如把 runid 设置上唯一约束, 在收到重复的错误时, 再根据表中的数据去调整 自增长的增长起点(DBCC CHECKIDENT 的 RESSED 选项)
    • 已标记为答案 yuxianye 2010年1月6日 9:00
    2010年1月6日 4:10

全部回复

  • Can't insert row anymore, have to reseed the column.
    • 已标记为答案 yuxianye 2010年1月6日 9:00
    2010年1月6日 3:23
  • Can't insert row anymore, have to reseed the column.

    重新设置列后,如果再从1开始,RunID就会有重复,原来的数据不能删除。
    请问怎么办?


    yuxianye
    2010年1月6日 3:42
  • Your table has more than 9,223,372,036,854,775,807 rows?
    • 已标记为答案 yuxianye 2010年1月6日 9:00
    2010年1月6日 3:58
  • 超过最大值的结果是收到错误 8115 , 看后面的测试
    CREATE TABLE #t(
    	id tinyint IDENTITY(255, 1),
    	col int
    );
    INSERT #t VALUES(1);
    INSERT #t VALUES(1);
    
    DROP TABLE #t
    
    /*-- 结果
    (1 row(s) affected)
    Msg 8115, Level 16, State 1, Line 6
    Arithmetic overflow error converting IDENTITY to data type tinyint.
    Arithmetic overflow occurred.
    --*/
    • 已标记为答案 yuxianye 2010年1月6日 9:00
    2010年1月6日 4:07
  • Can't insert row anymore, have to reseed the column.

    重新设置列后,如果再从1开始,RunID就会有重复,原来的数据不能删除。
    请问怎么办?


    yuxianye

    这个 SQL Server 没有办法自动解决, 只能自己想办法, 比如把 runid 设置上唯一约束, 在收到重复的错误时, 再根据表中的数据去调整 自增长的增长起点(DBCC CHECKIDENT 的 RESSED 选项)
    • 已标记为答案 yuxianye 2010年1月6日 9:00
    2010年1月6日 4:10
  • 我觉得这个问题不应该是个问题 ----摘自宋丹丹《火炬手》片段
    2010年1月6日 8:25
  • 超过最大值的结果是收到错误 8115 , 看后面的测试
    CREATE TABLE #t(
    
    	id tinyint IDENTITY(255, 1),
    
    	col int
    
    );
    
    INSERT #t VALUES(1);
    
    INSERT #t VALUES(1);
    
    
    
    DROP TABLE #t
    
    
    
    /*-- 结果
    
    (1 row(s) affected)
    
    Msg 8115, Level 16, State 1, Line 6
    
    Arithmetic overflow error converting IDENTITY to data type tinyint.
    
    Arithmetic overflow occurred.
    
    --*/
    
    

    谢谢 rmiao  邹建
    这个问题在极端情况下会出现,在实际的应用中还没有遇到。

    我的RunInfo表中的数据量比较大(表中还有其他列),有很多设备(成千上万而且还在递增)每天24小时不停的运行。这些记录都要保存几年甚至十几年 几十年。

    所以想到了这个问题。

    其实不等到表中的数据达到最大量,在查询效率和数据库大小等方面就需要考虑分区和拆分表等方法了。

    邹老大的精神很是佩服,能用测试的方法动手来证明8115错误。佩服。






    yuxianye
    2010年1月6日 8:59
  • 我觉得这个问题不应该是个问题 ----摘自宋丹丹《火炬手》片段

    我觉得这个问题不应该是个问题 ----摘自宋丹丹《火炬手》片段

    用其他办法可以避免
    yuxianye
    2010年1月6日 9:01