MySQL - 外部キー

提供: MochiuWiki : SUSE, EC, PCB

2025年12月6日 (土) 21:24時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == <br><br> == 外部キーの制約 == MySQLの外部キー制約で指定できる参照アクションを以下に示す。<br> <br> MySQLで実質的に使用できるものは、CASCADE、SET NULL、RESTRICT、NO ACTIONの4つである。<br> SET DEFAULTは構文上は認識されるが、InnoDBでは使用できない。<br> <br> <center> {| class="wikitable" |+ MySQLで指定可能な全アクション ! アクション !! 動作 !! 備考 |- | CA…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

概要



外部キーの制約

MySQLの外部キー制約で指定できる参照アクションを以下に示す。

MySQLで実質的に使用できるものは、CASCADE、SET NULL、RESTRICT、NO ACTIONの4つである。
SET DEFAULTは構文上は認識されるが、InnoDBでは使用できない。

MySQLで指定可能な全アクション
アクション 動作 備考
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            -- 親レコード更新時、子レコードがあれば拒否
 );