ExcelとAccessのスキルアップをサポートするサイトです

ExcelとAccessの学習室

【Accessクエリ入門】8回目-追加クエリ(INSERT INTO)を作る方法|失敗例と回避方法も解説

この記事で学習できること
  • 追加クエリの基本手順
  • 追加クエリを使うべきタイミング
  • 追加クエリを安全に使いこなすためのコツ

Accessクエリ入門シリーズ8回目の今回は、追加クエリについて解説していきます。

追加クエリはAccessのテーブルに新しいデータを追加するときに使うクエリで、SQLのINSERT文に相当する機能です。
また、INSERT文はデータベースを扱う人は必ず知っておかないといけない知識の一つでもあります。

クエリの編集画面からだけでなく、Accessフォームを使った入力作業やバッチ処理など、Accessを使用するさまざまなシーンでもよく使われる機能ですので、しっかりと習得しておきましょう。

本記事では、Access追加クエリの基本的な使い方だけでなく、SQL文の中身や注意点についても解説しています。
Access学習中の方は、本記事の内容をぜひ学習に活用してください。

どんな時に追加クエリを使う?

追加クエリは、抽出したデータを別のテーブルに新しい行として追記する処理です。
イメージとしては、Excelで「抽出した行を別シートに値貼り付け」する感じ。
元テーブルはそのまま、追加先テーブルにだけ行が増えると覚えてください。

実務を想定した場面としては、ざっと以下のような内容が挙げられます。

  • CSVやExcel内の全データを本番テーブルに取り込み
  • 月次締めデータを履歴テーブルに追記保存
  • マスタテーブル(顧客・商品など)に新規だけを一括追加したい
  • 基幹DBなど外部のテーブルから自分のテーブルに複製
  • 元データを触らず、別テーブルに抽出して試算・検証
  • パフォーマンス維持のために過去データを退避

つまり追加クエリは、取込→本番履歴化マスタ一括登録外部連携作業テーブル作成アーカイブ化など、業務のさまざまな場面で活躍する幅広い機能です。

追加クエリの基本手順

手順1-まずは選択クエリで結果を確認する

ここに空テーブル「T99_部品単価一覧表」があります。
他のテーブルデータを使い、まとまったデータを一括追加していきます。

新しい空のクエリを作ります。
追加したいデータを作るときは「選択クエリ」のままで編集しましょう。

クエリ内にテーブル「T01発注先マスタ」「T01部品マスタ」「T01価格マスタ」を追加します。

追加したいテーブル構成に合わせてフィールドを選択しましょう。

追加クエリでは、フィールドを選択するだけでなく、必要に応じて抽出条件を抽出(WHERE)したり、集計関数を使う(GROUP BY)こともできます。

手順2-追加クエリに切り替え(宛先と列対応を指定)

追加したいデータを作り終わったら、選択クエリを追加クエリに切り替えます。
クエリデザインの追加をクリックします。

追加先のテーブルを選びます。

そのままOKをクリックします。

クエリのデザイングリッドの項目が変わり、追加先テーブルのフィールドも表示されました。

これで追加先のフィールドを設定することができました。
「レコードの追加」に何も表示されない場合は、フィールド名などが間違っていることもありますので、クエリを実行する前によく確認しておきましょう。

手順3-クエリを実行して件数を確認する

では、追加クエリを実行して空のテーブルにデータを追加していきます。
リボンメニューの実行ボタンをクリックします。

確認ダイアログが表示されますが、そのまま「はい」をクリック。

追加先のテーブル「T99_部品単価一覧」を確認すると、データが正しく追加されているようです。

追加クエリは他のクエリとアイコンが異なるので、探すときの目印にしてください。

オブジェクトブラウザのアクションクエリをクリックすれば、実行ボタンを押したときと同じ動きが再現されます。
実行した回数だけ重複してデータ追加されてしまいますので、追加クエリのアイコンを触るときは特に注意しましょう。

実は、SQLビューを直接編集することで重複追加を防げます。

それは、WHERE以降に「NOT EXISTS」を追記することです。
後日別記事で解説しますが、参考のために以下のSQLコードを掲載しておきます。

INSERT INTO T99_部品単価一覧表 (部品ID, 単価)
SELECT s.部品ID, s.単価
FROM T01価格マスタ AS s
WHERE NOT EXISTS (
  SELECT 1 FROM T99_部品単価一覧表 AS t
  WHERE t.部品ID = s.部品ID
);

SQLビューで確認する追加クエリ(INSERT INTO … SELECT)

では、追加クエリを作ったときに自動作成されたSQL文を確認してみましょう。
SQLビューに切り替えると、下の画像のようにSQL文が作られています。

中身をよく見ると、INSERT文とSELECT文の両方が混在しているようです。

他のデータベースでも共通して使われるINSERT文の基本は、以下のような書き方です。

INSERT INTO [追加先のフィールド名] VALUES ( [追加したいデータ])

一方、ACCESSの追加クエリで作成させたSQLは以下の書き方です。

INSERT INTO [追加先のフィールド名] SELECT文

このように、AccessではSELECT文で抽出したデータをそのままINSERT文で挿入できるため、複数のレコードを効率的に一括追加することが可能です。

このINSERT INTO SELECTの構文は、PostgreSQLMySQLSQL ServerなどのRDBでも広く使用可能です。
複数のデータをまとめて追加したい場合は便利な書き方ですので、慣れておきましょう。

追加クエリの注意点(安全に使うコツ)

注意点1-本番でいきなり実行しない

前準備抜きでいきなり追加クエリを試すのはとても危険です。

軽い気持ちで試したものの、SQL文が間違っていたため、復旧に莫大な時間を費やすといったことがあってはいけません。
まずは、必ずダミーテーブルで試してから本番の操作を行い、希望どおりの結果になっていることを必ず確認しましょう。

また、本番の操作を行う直前にも、対象テーブルのバックアップは欠かさないようにしましょう。

注意点2-1件だけ追加ならSQLを直接書く(INSERT … VALUES)

Accessの追加クエリは、主にまとめたデータを一括追加する時に使われますが、状況によっては1件分だけデータを追加したい時もあります。
そんな時はSQL共通で使われるINSERT文をそのまま使用することをオススメします。

試しに、以下の設定で1件分だけデータを追加するクエリを作ってみました。

  • 「T01部品マスタ」に「鉄 アングル」という商品を「SUS アングル」に書き換えてデータを追加

単一データを追加されるようにクエリを編集すると、書き方は下の画像のようになります。
1件の項目を入力するために、データ項目を直接手入力する人はおそらくいないでしょう。

参考までにSQLビューを確認してみると、やはりINSERTとSELECTが混在しています。

一方、下のようにSQL共通のINSERT文に変えても正しくクエリは実行されます。

どちらで実行しても結果は同じですが、SQLの基本構文に沿ってINSERT文を書くほうが、他のデータベースにも応用が利きます。
DB関連のスキルを伸ばしたいなら、簡単な処理こそSQLを直接書く習慣を意識的につけていきましょう。

注意点3-参照整合性に沿った処理を行う(主キー・外部キー)

追加クエリを作成する時は、参照整合性を意識することも大事です。
参照整合性に沿っていないと、追加クエリがエラーで止まってしまい、先に進めません。

実例として、単一データを追加するときに使ったクエリの一部分を触ってみましょう。
変更後では『小分類ID』を削除してみます。

クエリを実行してみると、エラーで先に進めません。

エラーで止まった理由は、2つのテーブル『T01部品マスタ』と『T00小分類マスタ』はフィールド『小分類ID』でリレーションシップ設定されているためです。

参照整合性とは、「子テーブルに登録する値は、必ず親テーブルに存在していなければならない」というルールです。
そのため、親テーブルに存在しない『小分類ID』を登録しようとすると、追加処理はエラーになります。

もし似たようなエラーが発生した場合は、参照整合性に違反した追加クエリになっていないかを見直すと、いち早く原因を突き止めることができるでしょう。

追加クエリで失敗しないための回避策(テーブル丸ごとバックアップ)

追加クエリ(INSERT文)は便利ですが、一度実行すると元に戻せません。
想定していたデータ件数でなかった場合、再検証後の追加や削除に莫大な手間がかかってしまいます。

そのため、実務では「実行前にテーブルを丸ごとバックアップする」のが基本です。
バックアップの方法は以下のとおり。

  1. ナビゲーションウィンドウで対象テーブルを右クリック
  2. 「コピー」を選択
  3. 右クリック → 「貼り付け」
  4. テーブル名を「T01部品マスタ_backup」などに変更

これだけで、実行前の状態をそのまま保存できます。

事前の確認や処理である程度事故を防ぐこともできますが、一番カンタンで確実な回避策はテーブルのコピーです。
特に、替えの効かないテーブルにデータを追加する場合は、バックアップを必ず取る習慣をつけましょう。。

まとめ

今回は、Accessの追加クエリの使い方を解説しました。
Accessの追加クエリを使うことで、大量のデータを一括で追加することができるので便利です。
一方で、1件分だけデータを追加したいときは、INSERT文をそのまま使うのをおすすめします。
また、追加クエリの実行エラーが発生するときは、リレーションシップなどのデータベース設計に違反していないかを見直すとよいでしょう。

次回は、削除クエリについて解説します。

https://sys-daddy.com/delete_query_of_access/