MySQL - 外部キー
提供: MochiuWiki : SUSE, EC, PCB
📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
概要
外部キーの制約
MySQLの外部キー制約で指定できる参照アクションを以下に示す。
MySQLで実質的に使用できるものは、CASCADE、SET NULL、RESTRICT、NO ACTIONの4つである。
SET DEFAULTは構文上は認識されるが、InnoDBでは使用できない。
| アクション | 動作 | 備考 |
|---|---|---|
| CASCADE | 親レコードの削除・更新時に、子レコードも同様に削除・更新される。 | |
| SET NULL | 親レコードの削除・更新時に、子レコードの外部キー列がNULLに設定される。 | 外部キー列がNOT NULL制約を持つ場合は使用できない。 |
| RESTRICT | 参照している子レコードが存在する場合、親レコードの削除・更新を即座に拒否する | エラーが発生し、操作は実行されない。 |
| NO ACTION | MySQLではRESTRICTと同じ動作をする | SQL標準ではチェックのタイミングが異なる場合があるが、MySQLでは実質的に同一である。 |
| SET DEFAULT | 親レコードの削除・更新時に、子レコードの外部キー列がデフォルト値に設定される | MySQL 8.0.13以降でサポートされたが、InnoDBストレージエンジンでは認識されるものの拒否される。 (実際には使用できない) |
※注意
アクションを指定しない場合、デフォルトは RESTRICT である。
# 使用例
CREATE TABLE orders (
id INT PRIMARY KEY, -- 注文ID(主キー)
customer_id INT, -- 顧客ID(外部キー)
FOREIGN KEY (customer_id) -- 外部キー制約の定義
REFERENCES customers(id) -- customersテーブルのidカラムを参照
ON DELETE CASCADE -- 親レコード削除時、この注文も削除
ON UPDATE RESTRICT -- 親レコード更新時、子レコードがあれば拒否
);