SQL の基本 | DDL: データ定義言語 | Foreign Key: 外部キー
外部キー (Foreign Key) は、1 つまたは複数の別テーブルの主キーフィールドを参照し、参照整合性 (referential integrity) を確認するために使用される。つまり、許可されたデータ値だけがデータベースに保存されるようにする。
外部キーの例
たとえば、2 つのテーブルがあるとする。1 つはすべての顧客データを記録する customer テーブルで、もう 1 つは顧客の注文をすべて記録する orders テーブルである。そして、すべての注文データの顧客が customer テーブルに存在するという制約がある。ここで orders テーブルに外部キーを設定し、その外部キーが customer テーブルの主キーを参照するようにする。すると、orders テーブル内の顧客がすべて customer テーブルに存在することを保証できる。つまり、orders テーブルは customer テーブルに存在する顧客のデータを持つ。
2 つのテーブルの構造は次のとおりである。
customer テーブル
| フィールド名 | 特性 |
|---|---|
| sid | 主キー |
| last_name | |
| first_name |
orders テーブル
| フィールド名 | 特性 |
|---|---|
| order_id | 主キー |
| order_date | |
| customer_sid | 外部キー |
| amount |
上記の例では、orders テーブルの customer_sid フィールドが、customer テーブルの sid フィールドを指す外部キーである。
次に、orders テーブルを作成するときに使用する外部キーの指定方法をいくつか示す。
MySQL:
CREATE TABLE orders (
order_id INTEGER,
order_date DATE,
customer_sid INTEGER,
amount DOUBLE,
PRIMARY KEY (order_id),
FOREIGN KEY (customer_sid) REFERENCES customer (sid)
);
Oracle:
CREATE TABLE orders (
order_id INTEGER PRIMARY KEY,
order_date DATE,
customer_sid INTEGER REFERENCES customer (sid),
amount DOUBLE
);
SQL Server:
CREATE TABLE orders (
order_id integer PRIMARY KEY,
order_date DATETIME,
customer_sid INTEGER REFERENCES customer(sid),
amount DOUBLE
);
続いて、テーブル構造の変更によって外部キーを指定する例を見る。
ここでは、orders テーブルはすでに作成されており、外部キーはまだ指定されていないものとする。
MySQL:
ALTER TABLE orders
ADD FOREIGN KEY (customer_sid) REFERENCES customer (sid);
Oracle:
ALTER TABLE orders
ADD (CONSTRAINT fk_orders1) FOREIGN KEY (customer_sid) REFERENCES customer(sid);
SQL Server:
ALTER TABLE orders
ADD FOREIGN KEY (customer_sid) REFERENCES customer (sid);