---
title: "参照制約とは？FOREIGN KEY・REFERENCESと外部キーの意味【基本情報技術者試験】"
description: "SQLのFOREIGN KEYとREFERENCESで指定する参照制約について、主キー・外部キー・検査制約・表明との違いを整理し、基本情報技術者試験で選択肢を切る判断基準を解説します。"
last_modified_at: "2026-07-20"
canonical_url: "https://stemtazoo.github.io/fe/referential-integrity/"
section: "fe"
---

## まず結論

`FOREIGN KEY` と `REFERENCES` を使って指定するのは、**参照制約**です。

参照制約とは、

> 外部キーの値が、参照先の表に実際に存在する値だけになるようにする制約

です。

試験では、次の組合せをそのまま判断できるようにします。

```text
FOREIGN KEY + REFERENCES
→ 参照制約
```

## 直感的な説明

社員表と部署表を例にします。

```text
部署表
├─ 10：営業部
├─ 20：総務部
└─ 30：開発部

社員表
├─ 山田：部署番号10
├─ 佐藤：部署番号20
└─ 鈴木：部署番号99 ← 部署表に存在しない
```

部署番号99が部署表に存在しないのに、社員表へ登録できると、どの部署にも所属しない不整合なデータが生まれます。

参照制約は、このような登録を防ぎます。

> **参照先に存在しない値を、外部キーへ入れさせない。**

これが中心となる役割です。

## 定義・仕組み

参照制約では、ある表の列を、別の表の主キーや一意な列に関連付けます。

### 主キーと外部キー

部署表では、部署番号が各部署を一意に識別する主キーです。

社員表では、部署番号が部署表を参照する外部キーになります。

```text
部署表.部署番号
→ 主キー

社員表.部署番号
→ 外部キー
```

SQLでは、次のように指定します。

```sql
CREATE TABLE 部署 (
    部署番号 INTEGER PRIMARY KEY,
    部署名 VARCHAR(50)
);

CREATE TABLE 社員 (
    社員番号 INTEGER PRIMARY KEY,
    氏名 VARCHAR(50),
    部署番号 INTEGER,
    FOREIGN KEY (部署番号)
        REFERENCES 部署(部署番号)
);
```

この定義によって、社員表の部署番号には、部署表に存在する部署番号だけを登録できます。

### FOREIGN KEYの役割

`FOREIGN KEY` は、参照する側の列を指定します。

```sql
FOREIGN KEY (部署番号)
```

### REFERENCESの役割

`REFERENCES` は、参照先の表と列を指定します。

```sql
REFERENCES 部署(部署番号)
```

まとめると、次の関係です。

```text
FOREIGN KEY
→ 参照する側

REFERENCES
→ 参照される側
```

## 科目Aでどう出る？

試験では、SQLのキーワードから制約名を答える問題や、制約の役割を問う問題が出ます。

### 判断表

| キーワード・説明 | 対応する制約・用語 |
|---|---|
| `PRIMARY KEY`、`FOREIGN KEY` | キー制約 |
| `CHECK` | 検査制約 |
| `FOREIGN KEY` と `REFERENCES` | 参照制約 |
| `CREATE ASSERTION` | 表明 |
| `NOT NULL` | NULL禁止 |
| `UNIQUE` | 一意性制約 |

今回の判断軸は、次の一文です。

> **FOREIGN KEYとREFERENCESが並んだら参照制約。**

### キー制約との違い

キー制約は、主キーや外部キーなど、キーに関する制約の総称です。

参照制約は、その中でも特に、

> 外部キーと参照先の値の関係を守る制約

です。

したがって、`FOREIGN KEY` という言葉だけを見ればキー制約とも関係しますが、`REFERENCES` と組み合わせて問われた場合は、参照制約がより直接的な答えになります。

### 検査制約との違い

検査制約は、`CHECK` を使って値の条件を指定します。

```sql
CHECK (年齢 >= 0)
```

```text
値の範囲や条件
→ 検査制約

別表の値との整合性
→ 参照制約
```

### 表明との違い

表明は、複数の表にまたがる整合性条件などを宣言する考え方です。

標準SQLでは `CREATE ASSERTION` を使って指定します。

試験では、次の対応で切り分けます。

```text
CREATE ASSERTION
→ 表明
```

## どんな場面で使う？

参照制約は、関連する表同士のデータを正しく保つために使います。

### 存在しない部署番号の登録を防ぐ

社員表に、部署表に存在しない部署番号を登録できないようにします。

### 存在しない商品番号の登録を防ぐ

注文明細に、商品表に存在しない商品番号を登録できないようにします。

### 親データの削除による不整合を防ぐ

部署表の部署を削除するとき、その部署を参照している社員が残っていると不整合になります。

このときの動作は、DBMSや制約の設定によって変えられます。

| 設定例 | 動作 |
|---|---|
| `RESTRICT` / `NO ACTION` | 参照中なら削除を拒否する |
| `CASCADE` | 参照する側も連動して削除する |
| `SET NULL` | 外部キーをNULLにする |

FE試験では、まず次を押さえれば十分です。

> **親に存在しない値を子へ登録させず、親子関係の整合性を守る。**

## よくある誤解・混同

### FOREIGN KEYは主キーを作る指定

違います。

`PRIMARY KEY` は主キー、`FOREIGN KEY` は別表を参照する外部キーを指定します。

### REFERENCESは検索に使うSQL

違います。

`REFERENCES` は、外部キーがどの表・列を参照するかを示します。

### 参照制約は値の範囲を確認する

値の範囲や条件を確認するのは、主に検査制約です。

```text
年齢が0以上
→ CHECK

部署番号が部署表に存在する
→ FOREIGN KEY + REFERENCES
```

### 外部キーの値は必ず主キーと同じ列名でなければならない

列名が同じである必要はありません。

参照関係とデータ型などが適切に定義されていれば、列名が異なっていても参照できます。

### 外部キーにはNULLを入れられない

外部キーにNULLを許可するかどうかは、列の定義によります。

NULLを禁止したい場合は、`NOT NULL`も指定します。

## 関連用語との切り分け

| 用語 | 役割 |
|---|---|
| 主キー | 行を一意に識別する |
| 外部キー | 別表の行を参照する |
| 参照制約 | 外部キーと参照先の整合性を守る |
| 検査制約 | 値の条件や範囲を確認する |
| 一意性制約 | 値の重複を禁止する |
| NOT NULL制約 | NULLを禁止する |

データベース全体の構造を定義するスキーマとの関係は、[スキーマとは？ビュー・SQL・整合性制約との違い](https://stemtazoo.github.io/fe/database-schema/)も参考になります。

## まとめ（試験直前用）

- `FOREIGN KEY` と `REFERENCES` で指定するのは参照制約
- 外部キーは別表の主キーなどを参照する
- 参照先に存在しない値の登録を防ぐ
- 親子関係の整合性を守る
- `CHECK` は検査制約
- `CREATE ASSERTION` は表明
- `PRIMARY KEY` は主キーを指定する

覚える一文はこれです。

> **FOREIGN KEYで参照する列を決め、REFERENCESで参照先を指定する。**
