• ベストアンサー

Access 分割したテーブルを一対一で結合。新規レコードが作れなくなりました

過去に同様の質問が無かったようなので質問します。 Access2002です。 これまで顧客名簿を一つのテーブルで管理していたのですが、フィールド数が増えてきたので、 テーブルを5分割しました。 主テーブルに対し副テーブル4つを、主テーブルのID(主キー、オートナンバー型)と副テーブルそれぞれのID(数値型)で一対一結合しています。 下記のようなイメージです。 テーブルA-テーブルB テーブルA-テーブルC テーブルA-テーブルD テーブルA-テーブルE すると、 新規レコードの登録が出来なくなってしまいました。 全部のテーブルを結合させたクエリを作って、そのクエリを基にフォームを作ったり、 主テーブルのフォームに副テーブルのサブフォームを4つ設置したり、 幾つか方法を試みたのですが、どれも同じエラーメッセージが出ます。 ↓ 「インデックス、主キー、またはリレーションシップで値が重複しているので、テーブルを変更できませんでした。重複する値のあるフィールドの値を変更するか、インデックスを削除してください。または重複する値を使用できるように再定義してください。」 非常に基本的な質問なのかも知れませんが、お手上げです。 どなたかご教授くだされば幸いです・・・。

質問者が選んだベストアンサー

  • ベストアンサー
noname#7099
noname#7099
回答No.3

主テーブルのキーが保存されていない状態で、副テーブルを同時に保存しようとしているからだと思います。  副テーブルにID=0(またはnull)のレコードがすでに1件存在し、さらにもう1件同じキーのレコードを保存しようとした場合などに表示されます。 修正の手間の少ない順に解決法をならべてみました。 (検証していないので、間違ってるかもしれないけど) 1)(とても現実的解決法) 既存のほかのフォームやクエリー等でも不具合噴出するはずです。 フィールド数はいったいいくつになったのでしょうか?(うろ覚えですが、256近くまでOKだったと思いますが) 前のテーブル構造で突っ走るわけにはいきませんか? 2)(しごく現実的な方法) NO2さんのアドバイスのとおり、正規化して、正規化したものをマスタとして(例えば社員コードマスタとか、商品マスタとか)、1:Nでリレーションをつけてください。  これにより、正しく追加できるだけでなく、データベースの容量も削減することができます。  ただし、フォームやクエリーの作成方法により、不具合を起こす(あなたが想定していなかった動きをする)場合がありますから、(正規化すべきでないフィールドを正規化してしまった)注意が必要です。 3)(これで追加できれば儲けもの) 実際は1:1でしょうが、1:Nの構造にしてみてください。 これでうまく追加ができるなら 1:Nにならないように、プログラムを修正してください。 他のクエリーがあなたが想定している動作するかどうか、テストをしなおす必要があります。 4)(こんなんやってどうなる?方法) うまくいかないとは思いますが、 テーブルを2つに分けてみてください。 テーブル、フォームの作り方によっては、動くかもしれません。 でも他のクエリーは正常動作しないでしょうね。。。 5)(根本的解決法?時間の無駄?) 主テーブルだけ先に保存してから、副テーブルのフィールドを保存する順番にすると不具合はなくなると思います。 ただし、フォームの大幅な変更が必要だと思います。既存のフォーム、クエリー等全部見直し、再作成が必要です。 あまりに労力がかかりすぎると思います。 どんなフィールドがあるのか知りませんが、冷静になって、再構築してみてはいかがでしょうか。 がんばってみてください。

sou-nkhs
質問者

お礼

ありがとうございます。 まさしく冒頭でご指摘の通り、原因はインデックスの重複の設定でした。 フォームとサブフォームを作成し、VBAでIDの更新を設定し、解決しました。 懇切丁寧にアドバイス頂きありがとうございました。

その他の回答 (3)

  • keikan
  • ベストアンサー率42% (75/176)
回答No.4

テーブルAに項目1,項目2、項目3、項目4があったとします。主キーを項目1とします。 テーブルBに項目11、項目12,項目13、項目14があったとします。主キーを項目11とします。 ここで、 テーブルAの項目2とテーブルBの項目11が1対1で結合しているクエリーを考えます。 クエリーABの項目は項目1,項目2、項目3、項目4、 項目12,項目13 この場合テーブルB側の主キー項目11が入っていなかった場合テーブルBが主キーがないため上記のようなエラーがでます。参照はできますが追加変更はできません。 サブフォームの場合も項目11(主キー)が含まれる構造にしてください。 直接値は入力されなくてもいいので必ず主キーである項目11が含まれる構造にしてください(値はテーブルAの項目1から勝手に持って記ます)

  • Gin_F
  • ベストアンサー率63% (286/453)
回答No.2

1:1 の関係のテーブルというのは、特殊なものです。 一般的に、そのような関係のテーブルは作成しないですね。 単純に分割するのではなく、きちんと正規化をしてみてください。 [ACC2002] データベースの正規化の基礎 http://support.microsoft.com/default.aspx?scid=kb;JA;283878

参考URL:
http://support.microsoft.com/default.aspx?scid=kb;JA;283878
sou-nkhs
質問者

お礼

参照させて頂きました。 MSのサポートサイトも、こうして見ると 参考になりますね。 ありがとうございました。

noname#49904
noname#49904
回答No.1

 インデックス、主キー、またはリレーションシップで値が重複しているので……  一度テーブルの設定で、インデックス、主キーの設定を外して動きを見てください。 後で設定して比べて見たら案外、どこがわるかったか解決したこともありました。

sou-nkhs
質問者

お礼

ありがとうございます。 エラーの原因はインデックスの設定でした。 テーブルの中の一つに、 主キーやリレーションとは無関係のフィールドにインデックス設定をしていたものがあったために起こったエラーでした。 アドバイスありがとうございました。

関連するQ&A