WEBサービス部 Lesson20-21 / 4.5hour
Sep / 35hour
Total / 136.5hour
MySQLの外部キー制約って何だ?
「データの整合性と保つため!!」
・・・と言われてもピンと来ないと思うので、説明します。
まずは下記のような二つのテーブルがあったとします。
データベース名:php_sample01
テーブル:users
テーブル:products
例えば、この二つのテーブルに対して、
「usersにあるidというカラムと、productsにあるuser_idというカラムを関連づけることで、データを削除・追加・変更出来ないようにしたいな」
という時に活躍するのが外部キー制約となります。これを設定するには、参照する側(子テーブル)と参照される側(親テーブル)を決める必要があります。
今回は「user_id」のある「products」を子テーブルとし、「id」がある「users」を親テーブルとして、外部キー制約をつけていくこととして説明します。
子テーブル側で外部キーを設定する
Step.1 外部キーを設定したいカラムにインデックスを付与する
「その他」ってところにカーソルを合わせると、「インデックス」って項目があるからそれをクリックして実行!
Step.2 「リレーションビュー」をクリックして、外部キーを設定していく
それぞれの項目の意味
カラム:外部キー制約を設定したい子テーブル側のカラム名
データベース:親テーブルのデータベース名
テーブル:親テーブル名
カラム:外部キー制約を設定したい親テーブル側のカラム名
ON DELETEとON UPDATEについて
上記の四項目以外にも設定するところがありますね?
この選択肢は下記のような種類があります。
引用元:https://www.dbonline.jp/mysql/table/index11.html
ここでは「RESTRICT」(=日本語で”制限”)として設定します。
「保存」をクリック!
これで「user_id」と「id」が外部キー制約で結ばれました。
早速実験してみましょう。
外部キー制約実験:親テーブルにあるデータを消そうとしてみる
試しに、親テーブル側でidが2の鈴木花子さんを削除しようとすると、このようなエラーで表示されます。
これは先ほど設定した外部キー制約で、「id」と「user_id」が紐づいているため、勝手に削除は出来ないよ、とMySQLさんに怒られています。
外部キー制約実験:子テーブルから親テーブルにないidでデータを追加しようとする。
次に子テーブル側から以下のようなSQL文を実行しようとすると・・・
(user_id=6というのは、元々設定していないidとなります。)
またこんな風に叱られます。
これは、
「君が追加しようとしているレコードだけど、親テーブルにid=6なんてないから、追加出来ないよ」とということです。
このように、データベースの整合性をとるために必要とされる外部キー制約。
何でもかんでも使用すればいい、という訳ではありませんが要所で使用することで適切なデータベースを構築出来そうです。
さらに深く学ぶ
背景なんとなく知っているけどあんまり意識して使ったことのないものその一つが外部キー制約だったりする。外部キー制約とは詳しくは調べればいくらでも情報はあるが、かみ砕くと「他のテーブルのデータ…[…]
参考
https://www.dbonline.jp/mysql/table/index11.html
学習は全てウェブカツ!!というプログラミングスクールで学んでいます。
大手スクール生徒や現役エンジニアが多数学び直している「実務レベル」に特化した「稼ぐ」ためのプログラミングスクール[…]