クエリでのデータ更新ができない。

テーブル2つからなるクエリでデータ更新しようとすると「現在のレコードを書き込む時のエラー」が出て、できません。
何が悪いのでしょうか?

テーブルの構成とクエリの内容がもう少し詳しくないとなんともコメントしづらいですね。

以下、geminiによる回答

1. 主キー(プライマリキー)が設定・選択されていない

これが最も多い原因です。

  • 原因: 結合している両方のテーブルに主キーが設定されていない、あるいはクエリの表示項目に両方のテーブルの主キーが含まれていない場合、Baseは「どの行を更新すればよいか」を正確に判断できず、書き込みを拒否します。
  • 解決策:
    1. それぞれのテーブルに必ず「主キー(IDなど)」を設定してください。
    2. クエリの作成画面で、両方のテーブルの主キー列をフィールドに追加してください(表示したくない場合は、チェックボックスで非表示にしても構いませんが、クエリの構成要素には含める必要があります)。

2. 1対多(または多対多)のリレーションシップの問題

  • 原因: クエリで結合した結果、1つの行を更新することで複数の行に影響が出るような構造(多対多など)になっている場合、データの整合性を守るために読み取り専用になります。
  • 解決策:
    • リレーションシップが正しく「1対多」になっているか確認してください。
    • 基本的には「多」側のテーブルのデータは更新できますが、「1」側のテーブルを同時に更新しようとするとエラーになることが多いです。

3. クエリに計算式や「DISTINCT」が含まれている

  • 原因: クエリ内で「合計(SUM)」や「平均(AVG)」などの集計関数を使っていたり、重複を除去する「DISTINCT」を使用している場合、その結果は「仮想的なデータ」となるため、元のテーブルへ書き戻すことができません。
  • 解決策: データの更新を行いたい場合は、集計を含まないシンプルな結合クエリにする必要があります。
2 Likes

回答ではありません

BASEはクエリーでのデータ更新(UPDATE文?)はできないのでは?と思います。
と言いますのも、私の場合はAccess移行時に同じような事象で躓いて困っておりました。
Accessではテーブルから作成したクエリーからフォームを作り・表示し更新や新規登録ができていましたが、Accessクエリーで出来ていた作業をFirebird組込のBASEで実行してもAccessのようにはできませんでした。

対応事項
1.テーブル同士のリレーションシップを設定する
2.メインとなる1テーブルに連動するフォームを作る
3.リレーションするテーブルの値はフォームに配置したコントロールから取得しメインテーブルの該当項目に保存する
テーブルの更新はクエリーではなくテーブルを更新するようにしています。
ご参考まで。

2 Likes