ACCESS レコードを論理削除する方法

レコードを論理削除する方法

ACCESSで入力したデータは、テーブルにレコードとして行単位で保存されます。

もちろん、入力を誤ったり古くなったりしてレコードが不要になることがあります。
そういった場合にExcelですと行を削除しますが、ACCESSでは行を削除することはお勧めしません。

今回は、ACCESSでレコードを論理削除する方法をご紹介します。


こんにちは。
はこにわガジェット (@hakoniwagadget) です。

ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは使いこなすために少しスキルが必要なものの、うまく活用すればExcelよりも業務の効率化が図れます。
この記事ではACCESSの基本的な使い方をご紹介していきます。

レコードの論理削除とは

ACCESSのレコードの論理削除とは、ACCESSのデータ保管場所であるテーブルから実際にはレコードを削除せずに、削除フラグにチェックすることで外見上はレコードが削除されたように見せることです。

Excelを使い慣れた方からすると、レコードを消した方が楽なのでは?と思うかもしれませんが、ACCESSのようなリレーショナルデータベースでは物理的にレコードを削除することには一定のリスクが伴うため、論理削除をできる方式をとった方が無難です。

ACCESSでテーブルからレコードを削除するリスク

ACCESSでは、主キーを使って複数のテーブルを連結してデータを利用しています。
これをリレーショナルデータベースと言います。

そのため、あるテーブルのレコードを削除すると、そのレコードのデータが他のテーブルからも参照されている場合に、参照先がなくなってしまいデータの不整合が発生する可能性があります。

一つ例を示します。

こちらは商品情報を格納するテーブルです。
主キーは商品IDで、この値でテーブル内のレコードを一意に識別します。

一方こちらは、見積情報を入力するテーブルです。
このテーブル内では商品IDで商品を指定しています。

この2つのテーブルは商品IDでリレーション設定を行っています。

これは非常に一般的なACCESSでのテーブル間のリレーション設定です。

では、この状態でtest_商品テーブルのレコードを削除するとどうなるでしょうか?
試しに商品ID:7のレコードをDeleteボタンで削除します。

すると下記のメッセージが表示されます。

これは、商品ID:7はtest_見積テーブルで見積ID:4にも使われているので削除して大丈夫ですか?というメッセージです。

ここで「はい」を選択します。
するとtest_商品からは当然ID:7が削除されます。

一方、test_見積テーブルを見てみると見積ID:4も消えてしまっています。
商品を削除するだけで見積も消えてしまうのは困る、ということが多いでしょう。

ACCESSでのテーブルのレコードの削除は、こうした意図しないデータの削除も生んでしまう危険性があるのです。

レコードの連鎖削除

上記は一方のテーブルのレコードを削除することで、もう一方のレコードも消えてしまうケースでした。
これはテーブル間のリレーションシップでレコードの連鎖削除をするように設定しているためです。

リレーションシップ画面から、2つのテーブルのリレーション設定を見てみましょう。
2つのテーブルをつないでいる線をダブルクリックします。

するとリレーション設定の画面が開きます。

ここで、レコードの連鎖削除にチェックが入っているので、先ほどのような片方のテーブルのレコードを削除すると、連動して他のテーブルのレコードも削除されるということが発生します。

では、レコードの連鎖削除を外せばよいかというとそう簡単でもありません。
試しにレコードの連鎖削除を外してみましょう。

その上で、test_商品テーブルのID:4のレコードを削除します。
なお、ID:4の商品はtest_見積テーブルのID:3で使用しています。

すると、下記のメッセージが表示されます。

リレーションシップが設定されているので、レコードの削除はできないよ、ということです。
これはこれでレコードを削除できないので困りますね。

このように、テーブルのレコードを物理的に削除しようとすると、ACCESSのようなリレーショナルデータベースでは弊害が多いのです。

論理削除の方法

そのため、ACCESSでレコードを削除する際は論理削除をお勧めします。
論理削除とは、実際にテーブルからレコードを削除するのではなく、テーブルに削除フラグを作成して置き、削除フラグがTrueのレコードは削除されたものとしてフォームやレポートに表示しないようにする、という方法です。

例えば、以下のテーブルをご覧ください。

「削除」というフィールドを作ってあります。
この削除フィールドにチェックをすることで、レコードが削除したものとみなすのです。

しかし、この論理削除はレコードは残っているのに削除したものとみなす必要があるため、ACCESS開発者側での対応が必要になります。
例えば、クエリでは削除したデータを表示しないための抽出条件を設定します。

上記は、test_商品を元にした選択クエリです。
削除フィールドの抽出条件に「False」を設定しています。

つまり、削除がTrueのレコードは削除されたものとして表示しない、という条件にしているわけです。

テーブルを作るたびに削除フラグを設け、削除されたレコードを上記のようにクエリで抽出対象から除外して非表示にしたうえで、これらのクエリを元にフォームやレコードを作成するれば削除したレコードは表示されなくなります。

以上、レコードを論理削除する方法をご紹介しました。


ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。

そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。

ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。