>> MySQL入門トップに戻る
MySQLにおける外部キー制約について説明します。
あるカラムに外部キー制約を設定しておくと、そのカラムは他テーブルのカラムの値だけに
限定することができます。
ですが、いくつか条件があります。
・親テーブルと子テーブルが両方InnoDBであること
・子カラムと親カラムの型が一致していること
・子カラムに親カラム以外の値が入っていないこと
・親カラムにインデックスが設定されていること
細かいのは他にもありますが、大きくはこの三つです。
外部キー制約を設定するカラムが子カラムで、参照される側が親カラムです。
mysql_query関数やコマンドラインで以下のように設定します。
noというカラムは「seihin」テーブルの「id」カラムの値だけに限定されます。
外部キーは後から設定することも出来ます。
その場合はALTER TABLEを使います。
外部キー設定は非常によく使われるので覚えておきましょう。
削除したりした場合は子テーブルはどうなるでしょうか?
デフォルトの動作ではエラーになり、更新したり削除することができません。
ですが、そのときの動作を外部キー設定時に設定することができます。
以下のようなコマンドを書きます。
オプションは以下のものがあります。
NO ACTIONもエラーが発生します。
CASCADEは書いてる通り、親テーブルの値が5→10に変更された場合、
子テーブルの値も5→10に更新されます。
親テーブルのレコード削除時も子テーブルの方もレコードごと削除されます。
SET NULLは書いてあるとおりです。
この通り外部キーを設定しておけば、データベースそれぞれに関連性を持たせることが出来ます。
>> 【MySQL ストレージエンジンの設定、変更】に進む
>> MySQL入門トップに戻る
MySQL 外部キー制約(FOREIGN KEY)
あるカラムに外部キー制約を設定しておくと、そのカラムは他テーブルのカラムの値だけに
限定することができます。
ですが、いくつか条件があります。
・親テーブルと子テーブルが両方InnoDBであること
・子カラムと親カラムの型が一致していること
・子カラムに親カラム以外の値が入っていないこと
・親カラムにインデックスが設定されていること
細かいのは他にもありますが、大きくはこの三つです。
外部キー制約を設定するカラムが子カラムで、参照される側が親カラムです。
mysql_query関数やコマンドラインで以下のように設定します。
CREATE TABLE test(no int,sample int, FOREIGN KEY (no) REFERENCES seihin(id));上記のコードの場合は、testテーブルのnoというカラムに外部キー制約を設定しています。
noというカラムは「seihin」テーブルの「id」カラムの値だけに限定されます。
外部キーは後から設定することも出来ます。
その場合はALTER TABLEを使います。
ALTER TABLE test ADD FOREIGN KEY(no) REFERENCES seihin(id);親テーブルにない値を入れようとするとエラーになります。
外部キー設定は非常によく使われるので覚えておきましょう。
親テーブルの値更新 or 削除時の設定(ON UPDATE,ON DELETE)
外部キー設定の説明はしましたが、もし親テーブルのレコードの値を更新したり、削除したりした場合は子テーブルはどうなるでしょうか?
デフォルトの動作ではエラーになり、更新したり削除することができません。
ですが、そのときの動作を外部キー設定時に設定することができます。
以下のようなコマンドを書きます。
ALTER TABLE test ADD FOREIGN KEY(no) REFERENCES seihin(id) ON UPDATE オプション名 ON DELETE オプション名;後ろにON UPDATEとON DELETEをくっつけてオプション名を書きます。
オプションは以下のものがあります。
RESTRICT エラーが発生(デフォルト) NO ACTION エラーが発生 CASCADE 親テーブルに行われた処理と同じ処理が子テーブルにも行われる SET NULL 子テーブルにはNULLが設定される。何も設定しなかった場合はデフォルトのRESTRICTでエラーが発生します。
NO ACTIONもエラーが発生します。
CASCADEは書いてる通り、親テーブルの値が5→10に変更された場合、
子テーブルの値も5→10に更新されます。
親テーブルのレコード削除時も子テーブルの方もレコードごと削除されます。
SET NULLは書いてあるとおりです。
この通り外部キーを設定しておけば、データベースそれぞれに関連性を持たせることが出来ます。
>> 【MySQL ストレージエンジンの設定、変更】に進む
>> MySQL入門トップに戻る