参照動作(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