2009-07-29 32 views
4

私のクライアントは、「autonumber」として作成されたプライマリIDフィールドを持つアクセステーブルから約500レコードを誤って削除しました。オートナンバー列をオフにする(整数に戻す)ことで、500レコードをバックアップから復元することができましたが、今度はオートナンバーをオンに戻すことはできません。MS Access autonumberの問題

可能な解決策はありますか? IDフィールドは他のテーブルへのリンクとして使用されているので、この番号を参照するすべてのテーブルの番号を再割り当てせずにすべての番号を付け直すことはできません(首の痛みですが、可能です)。

テーブルにデータが既に存在する場合は、max(id)を開始点として使用して自動番号を付け直すという "トリック"はありますか?

+0

に新しいフィールドの名前を変更私はヨシップのメソッドが動作していることを確認することができますが、私は聞いています。このような状況でDBをバックアップしていないのですか? – JohnFx

答えて

4

ID番号フィールドをオートナンバー(すべてのフィールドは元のテーブルと同じである必要があります - IDを除く)で新しいテーブルを作成します。 NEWTABLEにoriginalTableからすべてのデータをコピーします。データが満たされると

INSERT INTO newTable SELECT * FROM originalTable 

を、originalTableを削除し、originalTableにNEWTABLEの名前を変更します。

この方法では、自動番号付けのすべての「穴」が保持され、newTableの自動番号付けが有効になります。

P.S.常にIDに外部キーを追加しようとします。その場合、一部のデータが削除されても、少なくとも一貫した状態になります。

+0

元のテーブルを削除するときと新しいテーブルの名前を変更したときに、リレーションシップを削除して再作成することを忘れないでください。 あなたの最後の文章は私には分かりません。外部キーを持たないテーブルがいくつかあります。これらは、一般に「マスター」テーブルまたはルックアップテーブルと呼ばれますが。たとえば、取引タイプ、国または州/州のテーブル。そして、私はあなたがこの場合「一貫性のある状態」によって何を意味するのかはよく分かりません。 –

+0

私は同意します。このDBは正しくセットアップされていますが、間違いが(少なくともそれほど簡単ではありませんでした)、悲しいかな、多くのプロジェクトと同様に、損傷が行われた後に呼び出されます。アクセスは、プログラマーでなくても、正しく設定されていないために崩壊するまで、かなりまともな "ソリューション"を得ることができるツールの1つです。 「メール室のジョー」が実際にはプログラムできないことに気がついたら、SQLサーバソリューションにクライアントをアップサイジングする作業がたくさんあります。>) –

+0

確かに、人々はそれを使って奇妙なことをしているのでアクセスは大嫌いになります彼らが何をしているのかを知らずに。しかし、ねえ、それはExcelやWordテーブルを使うよりも優れています。 –

0

合意していますが、オートナンバーネームが正しい順序になるようにORDER BYを追加することができます。そうしないと、他のテーブルにIDの関連付けが間違ってしまいます。

INSERT INTO newTable SELECT * FROM originalTable ORDER BY ID 

また、私は与えられた答えに追加することができた場合は、明示的にフィールドに名前を付ける代わりに*

+0

2番目のテーブルを最初のテーブルと同じにする場合は、明示的な名前は必要ありません(IDフィールドを除く)。 IDによる注文は、自動番号付けがSELECTステートメントからのIDで「上書き」されているため(IDは自由に選択されていないため)、ここでは何も行いません。 すべてのIDは元のテーブルから取得されるため、新しいIDは導入されず、間違ったIDの関連付けは発生しません。 –

+0

*と同意すると、元の投稿の「IDを除く」コメントは表示されませんでした。しかし、あなたは依然としてORDER BYが必要です。彼が削除された500のレコードを戻すとき、彼らは最後の行としてテーブルに入るでしょう。元のテーブルは正しいIDを持っていますが、正しい順序ではありません。例えば 、削除された行を持つオリジナル表に戻って追加: 1猫 2犬 5馬 3マウス(バック追加) 4ウサギは(再び追加) あなたはやってなくても、新しいテーブルに上にこれらをコピーする場合IDのとオートナンバーがオンとBY ORDERは、あなたが取得します: 1猫 2犬 3馬 4マウス 5ラビット 間違ったIDがジェット4から、あなたはまた、ADOでのオートナンバー型のシードを設定することができます上の –

1

を使用する必要があります。

アクセスオートナンバーフィールドについてはほとんど知られていませんが、データベースを圧縮して修復すると、カウンターのカウンターがリセットされます。

私はまた、挿入を行うと、自動カウンタで保持されている内部カウンタが(より大きい)限り、自動番号カウンタの次の数値ではなく、あなたはカウンターが1に設定する必要があり、ブランドの新しいアクセステーブルにこのような何かを行うことができますつまり、番号フィールド(全く意味を成さないこと?)

...

INSERT INTO myTable (myAutoNumber,myOtherField) VALUES (10000,'other data') 

他ここで言及されている解決策は、結果を保証するためのより良い仕事をするために優れているので、私は学問的理由のためにほとんど言及します。手遅れになりましだが、

セス

+0

コード。 –

+0

Jet 3.5(Access 97用)では、autonumberシードがcompactのフィールドの最高オートナンバーIDにリセットされました。しかし、Jet 4.0(Access 2000以降)では、これはテーブルにレコードがなく、シードが0に設定されている場合にのみ発生します。 –

+0

実際には、オートナンバーフィールドの値を持つレコードをテーブル。そのオートナンバー値がすでにテーブルの中に入っていない限り、私はちょうどcurrentdb.Execute( "INSERT INTOテーブル1(ID、テキストフィールド)VALUES(2、 'レコードID 2')")イミディエイトウィンドウではIDがオートナンバーフィールドです。 –

1

理想的なソリューションは、作業テーブルに欠落している500件のレコードを復元することであっwouuld've。次に、メインテーブルに追加クエリを実行します。これにはAutonumberフィールドが含まれていました。

0

あなたは新しいフィールドを作成し、それオートナンバー行い、その後、idフィールドを削除し、ID

関連する問題