オートナンバー型フィールドが上限値を超えた場合はどうなる?
オートナンバー型(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 になります。
さて、こうなると、以前に使われた値と同じになりますが、オートナンバー型では、重複しているか否かのチェックは行っていませんでした。