検索
連載

外部キー制約を活用する今から始める MySQL入門(8)(3/3 ページ)

Share
Tweet
LINE
Hatena
前のページへ |       

外部キー制約の動作を確認する

 冒頭でインストールしたsample_db5データベースでは、すでに外部キー制約の設定が完了しています。

 さっそく試しに、親テーブルであるitemのidカラム値のアップデートを行ってみましょう。親に対して行った修正が、子側にも反映されていることが確認できます。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

更新・削除時の動作パターン設定

 親側のデータを削除しようとした場合、子側にデータが残っていれば、外部キー制約によってエラーになります。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 外部キー制約ではまた、更新や削除の際の動作パターンを設定することもできます。

 先ほど、親側のitemテーブルのデータを削除した際、子側に同じデータが残っているとエラーが生じ、削除を行うことができませんでした。

 今度は、もう1つの親側のorder_mainテーブルのデータの削除を試みます。order_itemテーブルのorder_noカラムは、order_mainテーブルのorder_noカラムを親に持つよう外部キー制約を設定しています。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 今度は、親側の削除と同時に子側も削除されていることが分かります。

 こうした外部キーの動作パターンは、以下のように、子側のorder_itemテーブル構築時に設定します。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 まず「CONSTRAINT....CASCADE」で外部キー制約を設定しています。「fk_1」がorder_noカラムとorder_mainテーブルのorder_noカラムとの外部キー制約、「fk_2」がitemカラムとitemテーブルのidカラムとの外部キー制約になります。

 fk_1の後半では「ON DELETE CASCADE ON UPDATE CASCADE」で削除(ON DELETE)時に「CASCADE」、更新(ON UPDATE)時にもCASCADEが設定されています。CASCADEを指定することで、更新時には親側の更新に合わせて子側も同様の値で更新を行い、削除時には親側の削除に合わせ該当する子側のデータも削除されます。

 fk_2では「ON UPDATE CASCADE」で更新時にはCASCADEが設定されていますが、削除(ON DELETE)時の動作は設定されていません。この場合、デフォルトの「RESTRICT」が適用されます。RESTRICTでは、子側にデータが残っていて親側のデータを削除しようとした場合、エラーになります。

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***

 CASCADEやRESTRICTのほかに「SET NULL」も用意されています。外部キー制約を利用することで、PHPスクリプト側の負担を軽減することができます。

ON UPDATE ON DELETE
RESTRICT エラー エラー
CASCADE 親側の同じ値で子側を更新 親側の削除と同時に子側も削除
SET NULL 子側をNULL値で更新 子側をNULL値で更新
外部キー制約の設定

 このように外部制約キーを活用することにより、複数のテーブルにまたがる値を関連付けていくことができます。


さて次回は、これまで作成した「簡易在庫管理システム」と、DTO、DAOパターンを使って修正した「オンラインストア」を統合させ、ショッピングストアの処理を完成させます。


Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る