DAY 54 WEBサービス部 Lesson 20-21 外部キー制約とは?

DAY 54 WEBサービス部 Lesson20-21 / MySQLの外部キーについて 【ウェブカツ 】

SQL DAY 54 WEBサービス部 Lesson 20-21 外部キー制約とは?

WEBサービス部 Lesson20-21 / 4.5hour

Sep / 35hour

Total / 136.5hour

 

MySQLの外部キー制約って何だ?

 

「データの整合性と保つため!!」

 

・・・と言われてもピンと来ないと思うので、説明します。

まずは下記のような二つのテーブルがあったとします。

 

データベース名:php_sample01

 

テーブル:users

table_users

users_table

 

テーブル:products

table_products

 

products_table

 

例えば、この二つのテーブルに対して、

「usersにあるidというカラムと、productsにあるuser_idというカラムを関連づけることで、データを削除・追加・変更出来ないようにしたいな」

という時に活躍するのが外部キー制約となります。これを設定するには、参照する側(子テーブル)と参照される側(親テーブル)を決める必要があります。

今回は「user_id」のある「products」を子テーブルとし、「id」がある「users」を親テーブルとして、外部キー制約をつけていくこととして説明します。

 

子テーブル側で外部キーを設定する

Step.1 外部キーを設定したいカラムにインデックスを付与する

foerign_key_index

 

「その他」ってところにカーソルを合わせると、「インデックス」って項目があるからそれをクリックして実行!

 

Step.2 「リレーションビュー」をクリックして、外部キーを設定していく

foerign_key_setting

それぞれの項目の意味

カラム:外部キー制約を設定したい子テーブル側のカラム名

データベース:親テーブルのデータベース名

テーブル:親テーブル名

カラム:外部キー制約を設定したい親テーブル側のカラム名

 

ON DELETEとON UPDATEについて

上記の四項目以外にも設定するところがありますね?

この選択肢は下記のような種類があります。

foering_key_options

引用元:https://www.dbonline.jp/mysql/table/index11.html

 

ここでは「RESTRICT」(=日本語で”制限”)として設定します。

「保存」をクリック!

 

これで「user_id」と「id」が外部キー制約で結ばれました。

 

早速実験してみましょう。

 

外部キー制約実験:親テーブルにあるデータを消そうとしてみる

試しに、親テーブル側でidが2の鈴木花子さんを削除しようとすると、このようなエラーで表示されます。

foerign_key_error

 

これは先ほど設定した外部キー制約で、「id」と「user_id」が紐づいているため、勝手に削除は出来ないよ、とMySQLさんに怒られています。

 

外部キー制約実験:子テーブルから親テーブルにないidでデータを追加しようとする。

次に子テーブル側から以下のようなSQL文を実行しようとすると・・・

foering_key_sql

(user_id=6というのは、元々設定していないidとなります。)

 

またこんな風に叱られます。

foerign_key_sql_error

 

これは、

「君が追加しようとしているレコードだけど、親テーブルにid=6なんてないから、追加出来ないよ」とということです。

 

このように、データベースの整合性をとるために必要とされる外部キー制約。

何でもかんでも使用すればいい、という訳ではありませんが要所で使用することで適切なデータベースを構築出来そうです。

 

さらに深く学ぶ

Qiita

背景なんとなく知っているけどあんまり意識して使ったことのないものその一つが外部キー制約だったりする。外部キー制約とは詳しくは調べればいくらでも情報はあるが、かみ砕くと「他のテーブルのデータ…[…]

 

 

参考

https://www.dbonline.jp/mysql/table/index11.html

 

学習は全てウェブカツ!!というプログラミングスクールで学んでいます。

プログラミングスクール「ウェブカツ!!」

大手スクール生徒や現役エンジニアが多数学び直している「実務レベル」に特化した「稼ぐ」ためのプログラミングスクール[…]

DAY 54 WEBサービス部 Lesson 20-21 外部キー制約とは?
最新情報をチェックしよう!