SQL 速習チュートリアル

SQL FOREIGN KEY 制約

FOREIGN KEY(外部キー)制約は、2つのテーブル間にリンク(繋がり)を確立し、そのリンクを破壊するような操作を防ぐために使用されます。

FOREIGN KEY とは、別のテーブルの PRIMARY KEY(主キー)を参照している特定のカラムを指します。

  • 子テーブル(Child Table): 外部キーを持つ側のテーブル。
  • 親テーブル(Parent Table) / 参照テーブル: 参照される側の主キーを持つテーブル。

FOREIGN KEY 制約には、主に以下の2つの役割があります:

  1. 親テーブルに存在しない値を子テーブルの外部キーカラムに挿入することを防ぎ(不正なデータの防止)、データの整合性を保ちます。
  2. 子テーブルに関連するレコードが残っている場合、親テーブル側のレコードを削除できないように制限します。

1. 外部キーの具体例

以下の2つのテーブルを想定してみましょう。

Persons テーブル

PersonIDLastNameFirstNameAge
1HansenOla30
2SvendsonTove23

Orders テーブル

OrderIDOrderNumberPersonID
1778953
2446783
3224562
4245621

ここで、「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 構文を使用