外部キー制約の動作を確認する
冒頭でインストールした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.