0

エラー: IDENTITY をデータ型 int に変換中に算術オーバーフロー エラーが発生しました。算術オーバーフローが発生しました。

デバッグ:

id = my Identity 列、データ型 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 がない場合、現在の ID 値がこれほど高くなるのはなぜでしょうか?
  2. IDENT_CURRENT を max(id) と同じ数に安全に設定するにはどうすればよいですか? それとも、id 列が参照でない限り、再シードする方が簡単でしょうか?
4

2 に答える 2

0

Ad.1identityはテーブルからある程度独立しているからです。トランザクションは ID には影響せず、エラーにも影響しません。いくつかの行を挿入しようとして挿入が失敗した場合でも、ID 値はそれらの行用に予約されています。この動作の理由は、挿入を行う 2 つのトランザクションがあり、最初のトランザクションがロールバックされる場合、2 番目のトランザクションは最初のトランザクションの後に残ったギャップを埋めることを心配する必要がないためです。

動作を示す 2 つの例:

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

Ad.2 必要に応じて ID を再シードします。「変える」ことはできませんIDENT_CURRENT()

于 2013-10-22T10:32:23.200 に答える