【问题标题】:IDENT_CURRENT value is higher than max(id)IDENT_CURRENT 值高于 max(id)
【发布时间】:2013-10-31 00:52:39
【问题描述】:

错误: 将 IDENTITY 转换为数据类型 int 的算术溢出错误。 发生算术溢出。

调试:

id = 我的身份列,数据类型 INT。增量=1,种子=1

select max(id) as max, min(id) as min from eventlogreport
    Result: 6728550 1

select count(*) from eventlogreport
    Result: 6728550

到目前为止还不错。看起来我们有足够的空间容纳更多行。但是再插入 600 000 行会导致溢出错误。更多调试。

SELECT IDENT_CURRENT ('EventLogReport') AS Current_Identity;
    Result: 2147483647

问题:

  1. 表没有的情况下,当前的标识值怎么会这么高 包含相同数量的行,并且没有 id 跳过?
  2. 如何安全地将 IDENT_CURRENT 设置为与 max(id) 相同的数字?或者,只要不引用 id 列,重新播种可能更容易?

【问题讨论】:

  • 为什么不赞成这个问题?

标签: sql-server-2008 transactions identity-column


【解决方案1】:

身份值不参与事务 - 因此,如果您有大量尝试插入(在添加所有当前行之后)随后被回滚,那么IDENT_CURRENT 可能远高于最高表中的观测值。

同样,如果您实际插入了 2147483647 行,但随后删除了所有 ID 大于 6728550 的行,您会观察到相同的情况。

第三,可能有人将身份重新设定为 2147483647。

因此,您可以通过多种方式达到这种情况。我们不可能知道它是怎么来的。


要将标识值设置为适合下一次插入,请使用DBCC CHECKIDENT 两次:

DBCC CHECKIDENT(Table,RESEED,1)
DBCC CHECKIDENT(Table,RESEED)

第一个将下一个值设置为 2。第二个然后调用此部分:

如果表的当前标识值小于标识列中存储的最大标识值,则使用标识列中的最大值进行重置。请参阅下面的“例外”部分。

【讨论】:

    【解决方案2】:

    广告 1 这是因为identity 在某种程度上独立于表格。事务对身份没有影响,错误也没有。如果您尝试插入一些行,但插入失败,则无论如何都会为这些行保留标识值。 这种行为的原因是,如果您有两个事务在执行插入操作,而第一个事务会回滚,则第二个事务不必担心填补第一个事务后留下的空白。

    两个示例来演示该行为:

    drop table _test
    GO
    create table _test(
        id int identity(1,1),
        x tinyint
    )
    GO
    
    -- example 1 (insert error):
    
    insert into _test(x)
    select 1 as x union all 
    select 2 union all 
    select 256
    GO
    
    select * from _test
    select ident_current('_test')
    GO
    
    -- example 2 (rollback):
    
    begin tran
    
        insert into _test(x)
        select 1 as x union all 
        select 2
    
    rollback tran
    
    
    select * from _test
    select ident_current('_test')
    GO
    

    广告 2 如有必要,重新设置身份;你不能“改变”IDENT_CURRENT()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 2013-05-22
      相关资源
      最近更新 更多