📢 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> | ||