オートナンバー型フィールドが上限値を超えた場合はどうなる?

オートナンバー型(Long 長整数型)の最大値 2,147,483,647 の次はどうなるのか? という疑問を持った方がいらっしゃり、この疑問について調べてみました。

オートナンバー型のフィールドも、VBA + DAO であれば任意の値を設定できるので、試しにこの最大値を設定してみます。

テーブル名 TBL、フィールド名 FLD1(オートナンバー型)、その他のフィールドがあるものとします。

Dim db As Database
Dim rs As Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("TBL", dbOpenDynaset)
rs.AddNew
rs!FLD1 = 2147483647
rs.Update

このテーブルにデータシートビューでレコードを追加してみます。
すると、オートナンバー型のフィールドの値は -2147483648、長整数型の最小値になってしまいました。

これは、オートナンバー型が算術的ではなく論理的に1ずつ加算し、符号ビットも利用しているためのようです。

長整数型は、4バイトで表現されていますが、この最上位ビットが符号をあらわしています。
この符号ビットが 1 の時、値はマイナスとなります。

符号ビットのみが 1 で、他のビットがすべて 0 の場合(&H80000000)が最小値になり、符号ビットが 0 で、他のビットがすべて 1 の場合(&H7FFFFFFF)が最大値となっています。

&H00000000 0
&H00000001 1
&H00000002 2

・・・省略・・・

&H7FFFFFFE 2,147,483,646
&H7FFFFFFF 2,147,483,647
&H80000000 -2,147,483,648
&H80000001 -2,147,483,647
&H80000002 -2,147,483,646
・・・省略・・・
&HFFFFFFFE -2
&HFFFFFFFF -1

 

さて、それでは -1 の次はどうなるでしょうか?

上記のプロシージャで -1 を設定してみて同様にレコードを追加すると、次の値は 0 になり、そして、その次は 1 になります。

さて、こうなると、以前に使われた値と同じになりますが、オートナンバー型では、重複しているか否かのチェックは行っていませんでした。


目次へ戻る