MySQLで外部キー(FOREIGN KEY)を使う方法|InnoDBの制約とALTER構文を解説
本記事では、MySQLにおける外部キー(FOREIGN KEY)の基本的な考え方と、実際の設定方法をサンプルSQL付きで解説します。
MySQLの外部キーの基本
InnoDBテーブルは、外部キー制約(FOREIGN KEY制約)のチェックをサポートしています。ただし、単に2つのテーブルを結合(JOIN)するだけであれば、外部キー制約は必須ではありません。外部キーは、テーブル間の参照整合性を保証したい場合に活用する仕組みです。
一方で、InnoDB以外のストレージエンジンを使用している場合は注意が必要です。REFERENCES tableName(colName) という構文を記述しても実際の効果はなく、現在定義中の列が別のテーブルの列を参照することを意図していることを示す「コメント」として扱われるだけです。
さらに重要な点として、InnoDB以外では、MySQLは「colName」が「tableName」内に実際に存在するかどうか、あるいは「tableName」というテーブル自体が存在するかどうかを一切チェックしません。
親テーブルと子テーブルの関係
外部キーの仕組みでは、参照される側のテーブルを「親テーブル」、参照する側のテーブルを「子テーブル」と呼びます。親テーブル側では、外部キーから参照される列が主キー(PRIMARY KEY)として機能します。以下、具体例で確認していきましょう。
子テーブルの作成
mysql> create table StudentEnrollment
-> (
-> StudentId int,
-> StudentName varchar(200),
-> StudentFKPK int
-> );
Query OK, 0 rows affected (0.91 sec)
親テーブルの作成
mysql> create table College
-> (
-> StudentFKPK int,
-> CourseId int,
-> CourseName varchar(200),
-> CollegeName varchar(200),
-> primary key(StudentFKPK)
-> );
Query OK, 0 rows affected (0.46 sec)
上記の親テーブル(College)では、「StudentFKPK」列が主キーとして定義されています。続いて、ALTERコマンドを使って子テーブルに外部キーを追加します。
外部キーを追加する構文
既存の子テーブルに外部キーを追加する場合は、次の構文を使用します。
ALTER table yourChildTableName add constraint anyConstraintName foreign key(primary key column name for parent table) references College(primary key column name for parent table);
外部キーを使うメリット
- 参照整合性の保証: 存在しない親レコードへの登録・参照を防ぎ、不正なデータ混入を回避できます。
- データの一貫性維持: ON DELETE CASCADE などのオプションを使えば、親レコードの削除に合わせて子レコードを自動的に連動処理できます。
- 設計意図の明確化: テーブル間の関係がスキーマ上で明示され、チーム開発でも理解しやすいデータベースになります。
外部キーは正しく使えばデータ品質を大きく向上させる強力な機能です。ただし、パフォーマンスへの影響も考慮し、InnoDBなど制約を正しくサポートするストレージエンジンを選択することが重要です。
-
RDBMSの外部キー(Foreign Key)とは?主キーとの関係を具体例で解説
外部キー(Foreign Key)とは外部キー(Foreign Key)とは、複数のテーブル同士をつなぐリンクを作成するための仕組みです。あるテーブルの列が、別のテーブルの主キー(Primary Key)を参照することで、テーブル間の関連性を表現できます。外部キーを設定することで、データベースは「参照先に存在しない値」の登録を防ぎ、データの一貫性(参照整合性)を保つことができます。ここでは、Employee(従業員)テーブルの「DeptID」を例に、外部キーの働きを見ていきましょう。テーブル例1:Employee(従業員テーブル)EmpIDEmpNameEmpAgeDeptIDテーブル例2:D
-
Javaを使用してMySQLテーブルの値を表示する方法
MySQLデータベースのテーブル値をJavaで表示するには、ResultSetの概念を利用します。データベースへの接続には、MySQL JDBCドライバーを使用します。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table demo87 -> ( -> name varchar(20), -> age int -> )