Navicatブログ

MySQL外部キー制約のガイド 2023年6月2日 Robert Gravelle

正規化のプロセス中に、個別のエンティティを表すフィールドのグループが、より大きなテーブルやより中心的なテーブルから別のテーブルに削除されます。次に、共通フィールド(通常はID)を使用して、それらの関係を維持します。以下に例を示します:

film_id_fk (34K)

リレーショナルデータベースでは、テーブル間の参照整合性は外部キー制約を使用して強制されます。

このブログでは、外部キーの仕組みと、 Navicat 16 for MySQL を使用してMySQLで外部キー制約を作成する方法について説明します。

フィルムと在庫の関係について

イントロで見たモデルは、film(フィルム)テーブルとinventory(在庫)テーブルの間の1対多の関係を示しており、フィルムエンティティ(1行)は在庫テーブルの0個以上のエンティティ(行) にリンクできます。

filmテーブルは親テーブルまたは参照されるテーブルと呼ばれ、inventoryテーブルは子テーブルまたは参照しているテーブルと呼ばれます。そのため、子テーブルの外部キー列は、親テーブルのプライマリキー列を参照することがよくあります。

この例では、1つの関係だけに焦点を当てています。実際、テーブルは複数の外部キーを持つことができ、それぞれの外部キーは異なる親テーブルのプライマリキーを参照します。

外部キー制約が設定されると、子テーブルの外部キー列に親テーブルの親キー列に対応する行が含まれるか、これらの外部キー列の値がNULLになる必要があります。例えば、inventoryテーブルの各行には、filmテーブルのfilm_id列に存在するfilm_idがあります。inventoryテーブル内の複数の行が同じfilm_idを持つことができます。

次のセクションでは、Navicat 16 for MySQLでこの関係の外部キー制約を作成します。

Navicat での外部キー制約の作成

Navicatでは、テーブルデザイナーの外部キータブに外部キー制約があります。新しい外部キー制約を作成するためには、テーブルデザイナーで親テーブル(この場合はフィルム)を開き、外部キーを追加ボタンをクリックします。これにより、外部キーリストに新しい行が作成されます:

new_fk_on_film_table (39K)

次に、フィールドドロップダウンから“film”テーブルを選択し、被参照テーブルドロップダウンから“inventory”テーブルを選択し、被参照フィールドの“film_id”を選択します:

new_fk_on_film_table_with_fields_populated (44K)

次のステップでは、削除時のアクションと更新時のアクションを選択します。MySQLは、次の5つの異なる参照オプションをサポートしています:

  • CASCADE: 親テーブルの行を削除または更新する時に使用され、子テーブル内の一致する行の値が自動的に削除または更新されます。
  • SET NULL: 親テーブルの行を削除または更新する時に使用され、子テーブルの外部キー列の値がNULLに設定されます。
  • RESTRICT: 参照(子)テーブルに一致する行がある親テーブルから行を削除または更新する時に使用されます。MySQLでは親テーブルの行の削除または更新は許可されていません。
  • NO ACTION: RESTRICTに似ています。ただし、テーブルを変更しようとした後に参照整合性をチェックするという違いが1つあります。
  • SET DEFAULT: MySQLパーサーはこのアクションを認識します。ただし、InnoDBテーブルとNDBテーブルは両方ともこのアクションを拒否しました。

既存のFKの例に従い、RESTRICTの削除時アクションとCASCADEの更新時アクションを選択してみましょう:

new_fk_on_film_table_with_action_fields_populated (46K)

最後に、保存ボタンをクリックして、新しい外部キー制約を作成します。Nameフィールドに値を入力しない場合、Navicatによって名前が作成されることに注意してください。

結論

外部キーは、テーブル間の参照整合性を維持する上で重要な役割を果たします。したがって、テーブル関係ごとに1つ作成する必要があります。 Navicat 16 for MySQL を使用すると、SQLコマンドを記述することなく、外部キー制約を非常に簡単に管理できます。

ブログのアーカイブ
シェア