1

特定のテーブルについて、ID フィールドを AutoNumber (Increment) に設定しています。このテーブルに 5 行を立て続けに追加すると、それぞれの行の ID が最後の行よりも大きくなることが保証されますか? たとえば、以前の値が削除された場合、自動番号付けは 1 から再開されますか?

4

9 に答える 9

3

Access の自動採番で問題が発生したのは、誤って追加クエリを使用して自動採番キー フィールドの値を現在の最大値よりも小さい値に設定したときだけです。レコードの削除により、ナンバリングにギャップが生じていました。Access では、自動採番フィールドに値を強制的に入力することができますが、(常にではなく、理由はわかりませんが) 自動採番が低い数値にリセットされることがあります。最終的に、レコードが追加されると、「重複キー」エラーに遭遇しました。それ以外は、ここ数年困ったことはありません。

この質問には、増分値について説明する回答がいくつかあります。私の知る限り、Access の自動番号フィールドは「増分」(1 ずつ) または「ランダム」にしか設定できず、1 以外の数値の増分を設定する方法はありません。これについて間違っている場合は、教えてください。自分。

于 2009-04-20T02:31:01.650 に答える
2

David W. Fentonは、次のように述べています。インデックスに違反しない限り、フィールドに長整数値を追加します。」

これは少し混乱しています。ACE / Jet SQL構文にはIDENTITYキーワード(COUNTERAUTOINCREMENT)がありますが、AUTONUMBERキーワードはありません。明らかにACE/JetIDENTITYIDENTITY

しかし、ここで取り上げたいのは(コメントには長すぎる)、「特別なデフォルト値を持つ長整数フィールドのみ」であるという虚偽の記述です。

このACE/Jet SQL DDL(ANSI-92クエリモード構文)について考えてみます。

CREATE TABLE Test2_IDENTITY
(
   ID_identity_1 IDENTITY NOT NULL, 
   ID_identity_2 IDENTITY NOT NULL, 
   data_column INTEGER
);

実行すると、「結果テーブルに複数のAutoNumberフィールドを含めることはできません」というメッセージが表示されて失敗します。したがって、ここでは「特別なデフォルト値」以外の何かが起こっていることは明らかです。

キーワードは、IDENTITY値を生成するためのインクリメントアルゴリズムを使用して(より適切な用語が必要な場合に)自動番号を作成することです。IDENTITYランダムアルゴリズムまたは自動番号のGUID(レプリケーションID)フレーバーを使用して自動番号を作成するために使用することはできません。これらの他のケースでは、実際に「特別なデフォルト値」を使用する必要があります。

CREATE TABLE TestAutonumbers 
(
   ID_identity IDENTITY NOT NULL, 
   ID_random INTEGER DEFAULT GenUniqueID() NOT NULL, 
   ID_guid UNIQUEIDENTIFIER DEFAULT GenGUID() NOT NULL, 
   data_col INTEGER
);

ADOXなどのテクノロジーを使用してこのテーブルのプロパティ(情報スキーマ)を調べると、IDENTITYキーワードで作成された列のみがAutoincrementプロパティがtrueに設定され、この列のCOLUMN_HASDEFAULTがfalseでCOLUMN_DEFAULTがnullであることがわかります。したがって、IDENTITY列に「特別なデフォルト値」がある場合、エンジンは通知していません。

とは異なりIDENTITY、これらの他のフレーバーの自動番号では、テーブルごとに明示的な制限はありません。たとえば、これは正常に機能します。

CREATE TABLE Test2_Autonumbers
(
   ID_random_1 INTEGER DEFAULT GenUniqueID() NOT NULL, 
   ID_random_2 INTEGER DEFAULT GenUniqueID() NOT NULL, 
   ID_guid_1 UNIQUEIDENTIFIER DEFAULT GenGUID() NOT NULL, 
   ID_guid_2 UNIQUEIDENTIFIER DEFAULT GenGUID() NOT NULL, 
   data_col INTEGER
);

私が知らないのは、キーワード(またはその同義語)を使用する場合と使用しない場合で、自動インクリメント列GenUniqueID()と同等の「特別なデフォルト値」が存在するかどうかです。誰かがどちらかの方法を知っているなら、私に知らせてください。GenGUID()DEFAULTIDENTITY

ところで、上記のエラーメッセージは、「自動番号」がアクセス用語であるということについて私が間違っていたことを示唆しています。ACE / Jetエンジンレベルでは、「自動番号」はキーワード以外の同義語IDENTITY(つまり、自動インクリメントフレーバー自動番号)ですが、他のフレーバーの自動番号の同義語ではないようです。

于 2009-04-22T10:13:15.857 に答える
2

「一部のレコードが削除され、かつデータベースが圧縮された場合、次の ID は使用された最小の番号 + 1 にリセットされる」というステートメントは正しくありません。これは、Access 97 で使用される Jet 3.5 で発生しましたが、Access 2000 で使用される Jet 4.0 では発生しませんでした。

于 2009-04-21T01:53:03.853 に答える
1

私の答えは、VBA コードの 3 つの文字列です。

Set db = CurrentDb
Set tbl = db.TableDefs("your_tbl")
Set current_index = tbl.Indexes.Item("PrimaryKey").DistinctCount
于 2011-12-19T13:03:42.390 に答える
1

まず、IDENTITY(Access の Autonumber) 列はINTEGER(Access のレプリケーション ID) ではなく (Access の Long Integer UNIQUEIDENTIFIER) である必要があり、新しい値を生成し、シード値とインクリメント値をそれぞれ想定するために、ランダム アルゴリズムではなくインクリメント アルゴリズムを使用する必要があります。どちらもデフォルト値の 1 です。テーブルのすべての行を削除してデータベースを圧縮すると、IDENITTY列は 1 に再シードされます。そうでない場合は、Jet サービス パック ( http:// support.microsoft.com/kb/287756 )。

(アクセスの倍長整数)の正の最大値をINTEGER次の自動生成値が超えると、負の範囲に「ラップ」しINTEGER、正と負の範囲を循環し続け、重複する値が生成されることに注意してください。必要です (列が一意の制約によってさらにカバーされている場合を除く)。実際、増分値が十分に大きい場合、値が以前の自動生成された値よりも大きい値と小さい値の間で交互に変化することを保証できます (例: ACE/Jet ANSI-92 Query Mode 構文):

CREATE TABLE Test 
(
   ID INTEGER IDENTITY (0, 2147483647), 
   data_col INTEGER NOT NULL UNIQUE
)
;
INSERT INTO Test (data_col) VALUES (1)
;
INSERT INTO Test (data_col) VALUES (2)
;
INSERT INTO Test (data_col) VALUES (3)
;
INSERT INTO Test (data_col) VALUES (4)
;
INSERT INTO Test (data_col) VALUES (5)
;
INSERT INTO Test (data_col) VALUES (6)
;
INSERT INTO Test (data_col) VALUES (7)
;
INSERT INTO Test (data_col) VALUES (8)
;

自動生成される値は、0、2147483647、-2、2147483645、-4、2147483643、-6、2147483641 などです。

于 2009-04-20T08:14:30.327 に答える
1

Jet Autonumber フィールドは ID フィールドではありません。これは、特別なデフォルト値を持つ長整数フィールドのみです。そのデフォルト値は INCREMENT または RANDOM にすることができますが、これはデフォルト値にすぎないため、インデックスに違反しない限り、任意の長整数値をフィールドに追加できます。

すべてのレコードを削除して圧縮した場合、またはシード値が破損した場合を除き、増分オートナンバーは 1 に戻ることはありません。後者は、Jet 4 の初期バージョン (サービス パック 6 より前) で頻繁に発生し、シード値がリセットされ、PK インデックスの破損など、あらゆる種類の問題が発生しました。幸いなことに、これは最終的に修正されました。Jet は Windows コンポーネントであるため、Jet 4 サービス パック 8 よりも古いものを搭載しているコンピューターはほとんどありません。

ある日言われたように、増加する Autonumber が long integer の正の最大値を超えると、負の値を取得できますが、これはおそらくテーブルに別のデータベース エンジンが必要なほど十分な数のレコードがあるか、不適切にテーブルを一時テーブルとして扱う (つまり、多数のレコードを追加および削除する)。

他の人も言っているように、一意性は Autonumber データ型ではなく、インデックスによって制御されます。一意でないインデックスを作成した場合、重複する値を追加できます。重複する値を含む Autonumber フィールドが必要な理由は想像できませんが、重要なのは、一意のインデックスを追加しなくてもできるということです。ほとんどの Autonumber フィールドは代理主キーとして使用されるため、それらには一意の PK インデックスがあり、データ テーブルは PK 順 (クラスター化) で書き込まれます。一意性に関して、Autonumber を代理 PK として使用していて、テーブルに一意である必要がある自然キーがある場合 (一意にすることができます。つまり、Null は許可されません)、テーブルに一意のインデックスもある必要があります。自然キー フィールド (単一フィールドまたは複合インデックス)。

于 2009-04-20T20:36:06.703 に答える
1

レプリケートされたデータベースで以前使用されていたテーブルがあります。自動番号の一部は負であり、一部は非常に大きいです。これはレプリケートされたテーブルでは正常であるため、自動採番が以前の数値よりも大きくなるとは限りません。負になる可能性があります。

于 2009-04-20T12:14:15.303 に答える
0

一部のレコードが削除され、データベースが圧縮された場合、次のIDは使用された最小数+1にリセットされます。テーブルが空の場合、圧縮後に次のIDが1に戻されます。

于 2009-04-20T15:24:34.473 に答える