参照動作(ON DELETE CASCADEなど)(referential action)

分類
テクノロジ系 データベース
出る試験
基本情報応用情報
重要度
★★★☆☆

参照されている側の行が消されたり変えられたときに、参照している側をどう扱うかの決め方。一緒に消す、消させない、などを選ぶ。

もう少し詳しい説明

何を決めるのか

外部キーは、別の表の主キーを指す列です。

顧客表(顧客コード が主キー)
   ↑ 参照されている側
受注表(顧客コード が外部キー)
   ↑ 参照している側

このとき、顧客表の行を消したらどうなるかを決めておきます。この決め方が参照動作です。

5つの選び方

指定参照されている側が消されたとき
NO ACTIONその削除を拒否する(規格上の既定)
RESTRICTその削除を拒否する
CASCADE参照している側の行も一緒に消す
SET NULL参照している側の列をNULLにする
SET DEFAULT参照している側の列を既定値にする

書き方:

FOREIGN KEY (顧客コード)
  REFERENCES 顧客表 (顧客コード)
  ON DELETE CASCADE
  ON UPDATE RESTRICT

削除のときと更新のときを、別に決められます。 ON DELETE と ON UPDATE です。

NO ACTIONとRESTRICTの違い

どちらも拒否しますが、確かめる時点が違います。

指定確かめる時点
RESTRICTその命令の実行時にすぐ確かめる
NO ACTIONその命令が終わったあと(制約の検査の時点)に確かめる

試験では「どちらも削除を拒否する」というところまでで足ります。 違いが問われることは多くありません。

CASCADEを選ぶ場面

関係向く指定
受注と受注明細(明細は受注が無いと意味を持たない)CASCADE
顧客と受注(受注は記録として残したい)RESTRICT
部署と社員(部署が無くなっても社員は残る)SET NULL

「親が消えたら、子も意味を失うか」で分かれます。 意味を失うならCASCADE、記録として残すならRESTRICTです。

CASCADEの怖いところ

起きること中身
連鎖が続く消えた子をさらに参照する孫があると、そこも消える
消えた件数が見えにくい命令は1件の削除でも、実際には多数の行が消える
戻せない確定したあとは、戻すのに復旧の作業が必要になる

1行消したつもりが、何段も下まで消えることがあります。 CASCADEを宣言するときは、下に何が連なっているかを先に調べる形になります。

宣言せずにプログラムで消す場合

やり方性質
ON DELETE CASCADE で宣言するどの経路から消しても連鎖する。書き忘れが起きない
プログラムで子から順に消す連鎖の範囲が見える。書き忘れると、親の無い子が残る

どちらが良いとは決まっていません。 消える範囲を宣言で保証するか、処理の中で見えるようにするかという選び分けです。

参照している側の行が残ると

参照動作を宣言せず、親の行だけを消す経路があると、参照先の無い外部キーが残ります。

起きること見え方
結合しても出てこないその行が集計から落ちる
画面で名称が空になるコードはあるが、名前を引けない

この状態を作らないために、参照制約そのものを宣言します。 制約を宣言していれば、親を消す操作が拒否されるか、連鎖して消えるかのどちらかになり、中途半端な状態になりません。

試験ではこう出る

科目A(旧・午前)では、指定と動きの対応が問われます。一緒に消えるのがCASCADE、拒否されるのがRESTRICT(NO ACTION)、NULLになるのがSET NULLです。

どの指定を選ぶべきかという形も出ます。明細のように親が無いと意味を持たないものはCASCADE、記録を残したいものはRESTRICTです。

午後や応用情報(データベース)では、CREATE TABLE の空欄に書く形で出ます。ON DELETE のあとに何を書くか、という設問です。

関連する用語

外部キー
別の表の主キーを指す列。参照動作はこの宣言に付ける
主キー
参照される側の列
CREATE TABLEとALTER TABLE
参照動作を宣言する命令
トランザクション
まとまりとして確定させる仕組み。連鎖した削除も同じまとまりに入る

ミニクイズ

外部キーに ON DELETE CASCADE を指定した場合の動きとして、最も適切なものはどれか。

正解は 3番:参照されている側の行が削除されたとき、参照している側の行も削除される

ON DELETE CASCADEは、参照されている側の行が削除されたときに、参照している側の行も一緒に削除する指定です。削除を拒否するのはNO ACTIONまたはRESTRICT、参照している側の列をNULLにするのはSET NULL、既定値にするのはSET DEFAULTです。CASCADEは連鎖という意味で、行が連鎖して消える点が他と違います。

間違えた用語の復習リストを見る →

この分野をまとめて解く → データベースのミニテスト(全35問)

最終更新:2026-11-09