備忘録

なんとなく暇なときにでも....

MySQLの外部キーについて。

久しぶりに平日に投稿します。
最近は早めに仕事あがってひと駅分歩いて帰ったり、読書の時間増やしたりしております。

今日はタイトルの通り外部キーについて簡単にまとめました。

MySQLはリレーショナル・データベースです。
”リレーショナル”という言葉通りテーブル間にリレーションを貼ることができるので、存分にその威力を発揮させたいところです。

2つのテーブル間を結ぶフィールドを外部キーと呼びます。

User テーブル

id name password group_id
1 user_A ****** 1
2 user_B ****** 2
3 user_C ****** 3
1 user_D ****** 1


Groupテーブル

id name
1 group_A
2 group_B
3 group_C

のようなふたつのテーブルが存在していたとしたら、外部キーはUserテーブルのgroup_idとなります。

また2つのテーブルの関連付けの際には、テーブル間のレコードは1対多の関係になるように設定するのは正しい正規化と言われています。

と、ここまでは、調べればもっとわかりやすく説明しているサイトも存在するので、そちらを参照した方がいいかと思います。

1週間で学ぶIT基礎の基礎 - すぐわかるデータベースの基礎(3):ITpro

私は、基本DBの操作はGUIツールのSequel Proを使っていますが、今回初めて使うことになったのが、この外部キーの設定のやり方です。

f:id:tomAn:20160912215754p:plain:w300

外部キーを貼りたいテーブルを選択→上部の"関係"のタブ?を選択→タブの"+"ボタンを押す

すると上のような画面を表示することができ、外部キーに設定したい参照先のテーブル(table_A)のカラム名(column_A)、参照先のテーブル(table_B)とそのテーブルで関連付けるカラム(column_B)、動作を選択することで外部キーを設定できます。

ここでの動作とはtable_Bで設定したcolumn_Bになんらかの変更(DeleteやUpdate)を加えたときに、
関連づいたcolumn_Aにどのような動作を起こすかを決めるものです。

動作にはRESTRICT , CASCADE , SET NULL , NO ACTIONの4つがあり、それぞれ以下のような違いがあります。

UPDATE DALETE
RESTRICT エラーになる エラーになる
CASCADE 参照先の変更に追従する 参照先の変更に追従する
SET NULL NULLになる NULLになる
NO ACTION エラーになる エラーになる

上の2つのテーブルを例にするならば、Userテーブルのgroup_idが外部キーであり、参照先のGROUPテーブルのidカラムが参照先カラムで、UPDADE, DELETEそれぞれでのアクションはCASCADEするのがよさそうな気がします。



平日ですので、本日はここまで。