【入門編】 DELETE (DLET) – 階層型DBMS

やあ、調子はどうですか? データベースの世界へようこそ!

前回まではデータの「検索(GET)」や「追加(ISRT)」について学んできましたね。今回は、いよいよデータを消去する「DELETE(DLET)」コマンドについてお話しします。

「データを消すだけでしょ? 簡単じゃない?」と思うかもしれません。確かにコマンド自体はとてもシンプルです。しかし、階層型DBMSにおける削除には、「うっかり実行すると大切なデータがまるごと吹き飛ぶ」という、絶対に知っておくべき重要なルールが存在します。

ここさえクリアすれば、階層型DBMSの基本はバッチリマスターできますよ! 私と一緒に、楽しみながら本質を掴んでいきましょう。

—

1. そもそも「DLET」はどうやってデータを消すの?

階層型DBMSでデータを削除するとき、データベースエンジンは「何を消せばいいの?」とあなたに問いかけています。

リレーショナルデータベース(RDB)なら `DELETE FROM テーブル WHERE ID = 1` のように「条件」を指定して一発で消すことができますよね。しかし、階層型DBMSは「指さし確認」の文化です。

現在地(カーソル/カレンシー)がどこにあるかを確認し、「いま指で押さえているそのセグメント(データの塊)を消してください」と命じるのが `DLET`(ディリート)コマンドなのです。

削除の基本ステップは「掴んで、消す!」

具体的には、いきなり `DLET` を呼ぶことはできません。必ず次の2ステップを踏みます。

1. GHU (Get Hold Unique) などで、消したいデータに「鍵(Hold)」をかけて確保する
2. DLET コマンドで、確保したデータを削除する

パソコンでファイルを選択して(ハイライトさせて)から「Deleteキー」を押す感覚にとても似ていますね。

—

2. 【最重要】子セグメントが存在する場合のルール:「連鎖削除」

さて、ここからが今回のハイライトです!

階層型DBMSはその名の通り、データが「親と子(階層構造)」の関係で成り立っています。
パソコンの「フォルダ」と「ファイル」の関係を思い出してください。

📁 営業部(親セグメント)
├── 📄 山田さんのデータ(子セグメント)
└── 📄 佐藤さんのデータ(子セグメント)

もし、あなたがパソコンで「営業部」というフォルダごとゴミ箱に入れて削除したら、中の「山田さん」や「佐藤さん」のファイルはどうなるでしょうか?

当然、一緒になくなってしまいますよね。

階層型DBMSの `DLET` コマンドも、これとまったく同じ動きをします。これを専門用語で「カスケード削除(連鎖削除)」と呼びます。

なぜ注意が必要なのか?

親である「営業部セグメント」に指を置いて `DLET` を実行すると、DBMSは気を利かせて(?)、その下ぶら下がっている子セグメント、孫セグメントもすべて自動的に削除してしまいます。

「営業部の名前を変えたいから一旦消そう」なんて軽い気持ちで親を消すと、配下にいた数百人分の社員データが、一瞬でこの世から消え去るのです……!

> 💡 先輩からのアドバイス
> 階層型DBMSで `DLET` を叩くときは、「今自分が消そうとしている親の下に、どんな子どもたちがぶら下がっているか?」を必ず頭の中でツリー図を描いて確認しましょう!

—

3. コードで見る `DLET` の実際の流れ

では、実際のプログラム(疑似コード)で動きを確認してみましょう。
ここでは「会社データベース」から、ある「プロジェクト」と、それに紐づく「タスク」を削除するシミュレーションをしてみます。

  • ============================================================
  • 階層型DBMS (DL/I) 削除処理プログラムの例
  • ============================================================
  • ————————————————————
  • STEP 1: 削除したいセグメントを「Hold(保持)」付きで検索する
  • ————————————————————
  • `GHU` (Get Hold Unique) を使うことで、
  • データベースに「これからこのデータを操作するからロックしてね!」と伝えます。

CALL ‘CBLTDLI’ USING GHU,
PCB-MASK,
PROJECT-SEGMENT-BUFFER,
‘PROJECT (PROJID = P001)’

IF PCB-STATUS-CODE = ‘ ‘ THEN

  • 検索成功!ターゲットの「プロジェクトP001」に指が置かれました。
  • ——————————————————–
  • STEP 2: 指さしている現在位置のセグメントを削除する
  • ——————————————————–
  • ※注意: 「P001」にぶら下がる全ての「タスク」セグメントも
  • ここで一緒に連鎖削除(カスケード削除)されます!

CALL ‘CBLTDLI’ USING DLET,
PCB-MASK,
PROJECT-SEGMENT-BUFFER

IF PCB-STATUS-CODE = ‘ ‘ THEN
DISPLAY ‘プロジェクト P001 とその配下データの削除完了!’
ELSE
DISPLAY ‘エラー: 削除に失敗しました Code: ‘ PCB-STATUS-CODE
END-IF

ELSE
DISPLAY ‘エラー: 該当のプロジェクトが見つかりません’
END-IF

ポイントの解説

  • `GHU` コマンド: 単に読むだけの `GU` ではなく、削除の前には必ず “H(Hold)” がついた命令を使います。これが「削除の準備OK」の合図です。
  • `DLET` コマンドには条件を書かない: コードを見て気づきましたか? `DLET` の行には「PROJID = P001」という条件がありません。なぜなら、直前の `GHU` ですでに指さしているからです。

—

まとめ:ここを抑えれば階層型DBMSマスター!

お疲れ様でした! 今回学んだ『DLET』のポイントを振り返ってみましょう。

1. 削除は2ステップ:まず `GHU` などでターゲットを掴み(Hold)、その後に `DLET` を実行する。
2. 指さし削除:`DLET` 自体には検索条件を書かない。現在地(カレンシー)のデータが消える。
3. 恐怖の「連鎖削除」:親セグメントを消すと、子や孫のセグメントも道連れで自動削除される!

階層型DBMSは、データの親子関係がハッキリしているため、適切に使えば「親を消すだけで関連データを一括クリアできる」という非常に強力で高速な仕組みになります。構造を理解して正しく使えば、これほど頼もしい相棒はありません。

データの構造(木構造)をイメージしながら操作する感覚、少しずつ掴めてきましたか?
ここまでの概念を理解できたあなたなら、もう階層型DBMSの基本はバッチリマスターできていますよ!自信を持って次のステップへ進みましょうね。応援しています!

コメント

タイトルとURLをコピーしました