
過去に同様の質問が無かったようなので質問します。
Access2002です。
これまで顧客名簿を一つのテーブルで管理していたのですが、フィールド数が増えてきたので、
テーブルを5分割しました。
主テーブルに対し副テーブル4つを、主テーブルのID(主キー、オートナンバー型)と副テーブルそれぞれのID(数値型)で一対一結合しています。
下記のようなイメージです。
テーブルA-テーブルB
テーブルA-テーブルC
テーブルA-テーブルD
テーブルA-テーブルE
すると、
新規レコードの登録が出来なくなってしまいました。
全部のテーブルを結合させたクエリを作って、そのクエリを基にフォームを作ったり、
主テーブルのフォームに副テーブルのサブフォームを4つ設置したり、
幾つか方法を試みたのですが、どれも同じエラーメッセージが出ます。
↓
「インデックス、主キー、またはリレーションシップで値が重複しているので、テーブルを変更できませんでした。重複する値のあるフィールドの値を変更するか、インデックスを削除してください。または重複する値を使用できるように再定義してください。」
非常に基本的な質問なのかも知れませんが、お手上げです。
どなたかご教授くだされば幸いです・・・。
No.3ベストアンサー
- 回答日時:
主テーブルのキーが保存されていない状態で、副テーブルを同時に保存しようとしているからだと思います。
副テーブルにID=0(またはnull)のレコードがすでに1件存在し、さらにもう1件同じキーのレコードを保存しようとした場合などに表示されます。
修正の手間の少ない順に解決法をならべてみました。
(検証していないので、間違ってるかもしれないけど)
1)(とても現実的解決法)
既存のほかのフォームやクエリー等でも不具合噴出するはずです。
フィールド数はいったいいくつになったのでしょうか?(うろ覚えですが、256近くまでOKだったと思いますが)
前のテーブル構造で突っ走るわけにはいきませんか?
2)(しごく現実的な方法)
NO2さんのアドバイスのとおり、正規化して、正規化したものをマスタとして(例えば社員コードマスタとか、商品マスタとか)、1:Nでリレーションをつけてください。
これにより、正しく追加できるだけでなく、データベースの容量も削減することができます。
ただし、フォームやクエリーの作成方法により、不具合を起こす(あなたが想定していなかった動きをする)場合がありますから、(正規化すべきでないフィールドを正規化してしまった)注意が必要です。
3)(これで追加できれば儲けもの)
実際は1:1でしょうが、1:Nの構造にしてみてください。
これでうまく追加ができるなら
1:Nにならないように、プログラムを修正してください。
他のクエリーがあなたが想定している動作するかどうか、テストをしなおす必要があります。
4)(こんなんやってどうなる?方法)
うまくいかないとは思いますが、
テーブルを2つに分けてみてください。
テーブル、フォームの作り方によっては、動くかもしれません。
でも他のクエリーは正常動作しないでしょうね。。。
5)(根本的解決法?時間の無駄?)
主テーブルだけ先に保存してから、副テーブルのフィールドを保存する順番にすると不具合はなくなると思います。
ただし、フォームの大幅な変更が必要だと思います。既存のフォーム、クエリー等全部見直し、再作成が必要です。
あまりに労力がかかりすぎると思います。
どんなフィールドがあるのか知りませんが、冷静になって、再構築してみてはいかがでしょうか。
がんばってみてください。
ありがとうございます。
まさしく冒頭でご指摘の通り、原因はインデックスの重複の設定でした。
フォームとサブフォームを作成し、VBAでIDの更新を設定し、解決しました。
懇切丁寧にアドバイス頂きありがとうございました。
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から勝手に持って記ます)
No.2
- 回答日時:
1:1 の関係のテーブルというのは、特殊なものです。
一般的に、そのような関係のテーブルは作成しないですね。
単純に分割するのではなく、きちんと正規化をしてみてください。
[ACC2002] データベースの正規化の基礎
http://support.microsoft.com/default.aspx?scid=k …
参考URL:http://support.microsoft.com/default.aspx?scid=k …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセスの更新クエリでカレントレコードのみ更新したい 1 2022/06/02 23:32
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- Oracle SQL update方法 2 2022/06/22 14:07
- その他(データベース) IT用語について質問です。 以前ITパスポートの試験を受けた際にデータベースが何の集まりかについての 2 2022/12/10 12:29
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- その他(データベース) accessについて 2 2022/05/31 16:58
- Access(アクセス) Access クエリ 同一テーブル内 複数フィールドの同時集計のやり方について 1 2022/05/18 19:01
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
2つのテーブルに共通するレコ...
-
Accessのリンクされたテーブル...
-
ACCESSユニオンクエリから新テ...
-
ACCESSでテーブルをコピーしよ...
-
テーブルに表示されているもの...
-
access vbaにてテンポラリーテ...
-
access2000・・テーブルをデー...
-
Accessのテーブルで、リンク?...
-
accessエラー回避について
-
Sum・クエリ・テーブルの特定の...
-
Acccessで2つのテーブルから1...
-
AccessのフィールドにIPアドレ...
-
Accessで使用しているリンクテ...
-
リンクテーブル(Oracle)をAcc...
-
ExcelVBAでACCESSのクエリに接...
-
ACCESSでABC判定をしたい
-
アクセス2000でのリンク先...
-
ACCESSにおけるレコードの足し...
-
アクセス・デザインビューのレ...
-
外部MDBのリンクテーブルの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2つのテーブルに共通するレコ...
-
ACCESSユニオンクエリから新テ...
-
テーブルに表示されているもの...
-
Accessのリンクされたテーブル...
-
access vbaにてテンポラリーテ...
-
Acccessで2つのテーブルから1...
-
最新日のデータのみ抽出するク...
-
Accessのテーブルで、リンク?...
-
Accessでリストの並び順を変更...
-
アクセス 部分一致の抽出
-
ACCESS テーブルを見比...
-
ACCESSでテーブルをコピーしよ...
-
accessのテーブルを閉じたとき...
-
ACCESS テーブルを見比...
-
AccessでのリンクテーブルとADO...
-
クエリで同一テーブルの複数回...
-
accessエラー回避について
-
アクセス2016 チェックボックス...
-
Access 分割したテーブルを一対...
-
access2000・・テーブルをデー...
おすすめ情報