MySQL FOREIGN KEY 制約
1. MySQL FOREIGN KEY 制約の概要
FOREIGN KEY(外部キー)制約は、2つのテーブル間にリンクを確立し、そのリンクを破壊するようなアクションを防止するために使用されます。
FOREIGN KEY は、別のテーブルの PRIMARY KEY(主キー)を参照しているカラム(またはカラムの集合)のことです。
- 子テーブル (Child Table): 外部キーを持つ側のテーブル。
- 親テーブル (Parent Table / Referenced Table): 主キーが参照される側のテーブル。
FOREIGN KEY 制約には以下の重要な役割があります。
- 不正なデータ挿入の防止: 親テーブルに存在しない値を、子テーブルの外部キーカラムに挿入することはできません。
- 整合性の保護: 子テーブルに関連する行が存在する限り、親テーブルのレコードを削除することはできません。
2. 外部キーのリレーションシップ例
以下の2つのテーブルがあると仮定します。
Persons テーブル (親テーブル)
| PersonID | LastName | FirstName | Age |
|---|---|---|---|
| 1 | Hansen | Ola | 30 |
| 2 | Svendson | Tove | 23 |
Orders テーブル (子テーブル)
| OrderID | OrderNumber | PersonID |
|---|---|---|
| 3 | 22456 | 2 |
| 4 | 24562 | 1 |
この例では、"Orders" テーブルの "PersonID" カラムが、"Persons" テーブルの "PersonID" カラムを指しています。
- "Persons" テーブルの "PersonID" カラムは、同テーブルの PRIMARY KEY です。
- "Orders" テーブルの "PersonID" カラムは、同テーブルの FOREIGN KEY です。
3. CREATE TABLE 時の FOREIGN KEY 設定
"Orders" テーブルを作成する際に、"PersonID" カラムに対して FOREIGN KEY 制約を定義する SQL は以下の通りです。
実行例
/* Orders テーブルを作成し、Persons テーブルへの外部キーを設定する */
CREATE TABLE Orders (
OrderID int PRIMARY KEY,
OrderNumber int NOT NULL,
PersonID int,
CONSTRAINT fk_Person
FOREIGN KEY (PersonID)
REFERENCES Persons(PersonID)
);4. ALTER TABLE 時の FOREIGN KEY 設定
すでに "Orders" テーブルが作成されている状態で、"PersonID" カラムに FOREIGN KEY 制約を追加するには、以下の SQL を使用します。
実行例
/* 既存の Orders テーブルに外部キー制約を追加 */
ALTER TABLE Orders
ADD CONSTRAINT fk_Person
FOREIGN KEY (PersonID)
REFERENCES Persons(PersonID);5. FOREIGN KEY 制約の削除
設定されている FOREIGN KEY 制約を削除するには、以下の SQL を実行します。
実行例
/* 制約名(fk_Person)を指定して外部キーを削除 */
ALTER TABLE Orders
DROP FOREIGN KEY fk_Person;