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

ページの作成:「== 概要 == <br><br> == 外部キーの制約 == MySQLの外部キー制約で指定できる参照アクションを以下に示す。<br> <br> MySQLで実質的に使用できるものは、CASCADE、SET NULL、RESTRICT、NO ACTIONの4つである。<br> SET DEFAULTは構文上は認識されるが、InnoDBでは使用できない。<br> <br> <center> {| class="wikitable" |+ MySQLで指定可能な全アクション ! アクション !! 動作 !! 備考 |- | CA…」
 
 
(同じ利用者による、間の1版が非表示)
1行目: 1行目:
== 概要 ==
== 概要 ==
外部キーは、データベースにおいてテーブル間の関連性を定義し、参照整合性を維持するための制約である。<br>
<br>
MySQLでは、InnoDBストレージエンジンが外部キー制約をサポートしており、親テーブルと子テーブル間のデータの一貫性を自動的に保証する。<br>
外部キーを使用することにより、存在しないレコードへの参照や関連データの不整合を防ぐことができる。<br>
<br><br>


== 外部キーの基本構文 ==
外部キーは、<code>FOREIGN KEY</code> 句を使用してテーブル作成時またはテーブル変更時に定義する。<br>
<br>
<syntaxhighlight lang="mysql">
# テーブル作成時に外部キーを定義
CREATE TABLE 子テーブル名 (
    カラム名 データ型,
    FOREIGN KEY (カラム名) REFERENCES 親テーブル名(参照カラム名)
);
# 既存テーブルに外部キーを追加
ALTER TABLE 子テーブル名
ADD CONSTRAINT 制約名
FOREIGN KEY (カラム名) REFERENCES 親テーブル名(参照カラム名);
</syntaxhighlight>
<br><br>
<br><br>


40行目: 61行目:
       ON UPDATE RESTRICT            -- 親レコード更新時、子レコードがあれば拒否
       ON UPDATE RESTRICT            -- 親レコード更新時、子レコードがあれば拒否
  );
  );
</syntaxhighlight>
<br><br>
== 外部キーの要件 ==
MySQLで外部キーを使用するには、以下に示す要件を満たす必要がある。<br>
<br>
* 両方のテーブルが<u>InnoDBストレージエンジン</u>を使用していること。
* 外部キー列と参照先の列は、<u>同じデータ型</u>でなければならない。
* 参照先の列は、<u>インデックスが作成されている</u>必要がある。(通常は、主キー または ユニークキー)
* 外部キー列にもインデックスが自動的に作成される、
<br><br>
== 外部キーの確認 ==
定義されている外部キー制約を確認するには、以下に示すコマンドを使用する。<br>
<br>
<syntaxhighlight lang="mysql">
# テーブルの外部キー情報を表示
SHOW CREATE TABLE テーブル名;
# データベース内の外部キー制約を確認
SELECT * FROM information_schema.KEY_COLUMN_USAGE
    WHERE TABLE_SCHEMA = 'データベース名'
      AND REFERENCED_TABLE_NAME IS NOT NULL;
</syntaxhighlight>
<br><br>
== 外部キーの削除 ==
既存の外部キー制約を削除するには、<code>ALTER TABLE</code>文を使用する。<br>
<br>
<syntaxhighlight lang="mysql">
# 外部キー制約の削除
ALTER TABLE テーブル名
    DROP FOREIGN KEY 制約名;
</syntaxhighlight>
<br>
<u>※注意</u><br>
制約名を確認するには、<code>SHOW CREATE TABLE</code>コマンドを使用する。<br>
<br><br>
== 外部キー制約の一時的な無効化 ==
データの一括投入などで外部キーチェックを一時的に無効にする場合は、以下に示すコマンドを使用する。<br>
<br>
<syntaxhighlight lang="mysql">
# 外部キーチェックを無効化
SET FOREIGN_KEY_CHECKS = 0;
# データ操作を実行
# ...略
# 外部キーチェックを再度有効化
SET FOREIGN_KEY_CHECKS = 1;
</syntaxhighlight>
</syntaxhighlight>
<br>
<u>※警告</u><br>
<u>外部キーチェックを無効にすると、データの整合性が失われる可能性があるため、使用には十分注意が必要である。</u><br>
<br><br>
<br><br>