SQL FOREIGN KEY 制約
FOREIGN KEY(外部キー)制約は、2つのテーブル間にリンク(繋がり)を確立し、そのリンクを破壊するような操作を防ぐために使用されます。
FOREIGN KEY とは、別のテーブルの PRIMARY KEY(主キー)を参照している特定のカラムを指します。
- 子テーブル(Child Table): 外部キーを持つ側のテーブル。
- 親テーブル(Parent Table) / 参照テーブル: 参照される側の主キーを持つテーブル。
FOREIGN KEY 制約には、主に以下の2つの役割があります:
- 親テーブルに存在しない値を子テーブルの外部キーカラムに挿入することを防ぎ(不正なデータの防止)、データの整合性を保ちます。
- 子テーブルに関連するレコードが残っている場合、親テーブル側のレコードを削除できないように制限します。
1. 外部キーの具体例
以下の2つのテーブルを想定してみましょう。
Persons テーブル
| PersonID | LastName | FirstName | Age |
|---|---|---|---|
| 1 | Hansen | Ola | 30 |
| 2 | Svendson | Tove | 23 |
Orders テーブル
| OrderID | OrderNumber | PersonID |
|---|---|---|
| 1 | 77895 | 3 |
| 2 | 44678 | 3 |
| 3 | 22456 | 2 |
| 4 | 24562 | 1 |
ここで、「Orders」テーブルの PersonID カラムに注目してください。このカラムは「Persons」テーブルの PersonID カラムを指し示しています。
- 「Persons」テーブルの PersonID は、そのテーブルの PRIMARY KEY です。
- 「Orders」テーブルの PersonID は、FOREIGN KEY となります。
2. CREATE TABLE における FOREIGN KEY 制約
「Orders」テーブルを作成する際に、同時に PersonID カラムへ FOREIGN KEY 制約を定義する SQL は以下の通りです。
CREATE TABLE Orders (
OrderID int PRIMARY KEY, -- オーダーIDを主キーに設定
OrderNumber int NOT NULL,
PersonID int,
-- fk_Person という名前で外部キー制約を定義
CONSTRAINT fk_Person
FOREIGN KEY (PersonID)
REFERENCES Persons(PersonID)
);3. ALTER TABLE における FOREIGN KEY 制約
「Orders」テーブルが既に作成された後で、後から PersonID カラムに FOREIGN KEY 制約を追加する場合は、以下の構文を使用します。
ALTER TABLE Orders
ADD CONSTRAINT fk_Person
FOREIGN KEY (PersonID)
REFERENCES Persons(PersonID);4. FOREIGN KEY 制約の削除
不要になった FOREIGN KEY 制約を削除するには、使用しているデータベースエンジン(RDBMS)に合わせて以下の SQL を実行します。
SQL Server / Oracle / MS Access:
ALTER TABLE Orders
DROP CONSTRAINT fk_Person; -- 制約名を指定して削除MySQL:
ALTER TABLE Orders
DROP FOREIGN KEY fk_Person; -- MySQLでは DROP FOREIGN KEY 構文を使用