FOREIGN KEY 外鍵約束
FOREIGN KEY 外鍵用來建立資料表之間的關聯,確保資料的參考完整性(Referential Integrity)。外鍵欄位的值必須存在於另一個資料表的主鍵中。
為什麼需要外鍵?
假設有兩個資料表:
customers 資料表:
| id | name |
|---|---|
| 1 | 張一 |
| 2 | 王二 |
orders 資料表:
| id | order_no | customer_id |
|---|---|---|
| 1 | A001 | 1 |
| 2 | A002 | 2 |
我們希望 orders 中的 customer_id 只能是 customers 中存在的 id,這就需要外鍵約束。
建立資料表時設定
CREATE TABLE orders (
id INT PRIMARY KEY,
order_no VARCHAR(20),
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(id)
);
命名外鍵約束
CREATE TABLE orders (
id INT PRIMARY KEY,
order_no VARCHAR(20),
customer_id INT,
CONSTRAINT fk_order_customer
FOREIGN KEY (customer_id) REFERENCES customers(id)
);
外鍵的參照動作
當主表的資料被更新或刪除時,可以指定外鍵的行為:
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
| 動作 | 說明 |
|---|---|
| CASCADE | 同步更新或刪除關聯資料 |
| SET NULL | 將外鍵欄位設為 NULL |
| SET DEFAULT | 將外鍵欄位設為預設值 |
| RESTRICT | 禁止更新或刪除(預設行為) |
| NO ACTION | 與 RESTRICT 類似 |
新增外鍵約束
ALTER TABLE orders
ADD FOREIGN KEY (customer_id) REFERENCES customers(id);
-- 或命名約束
ALTER TABLE orders
ADD CONSTRAINT fk_order_customer
FOREIGN KEY (customer_id) REFERENCES customers(id);
移除外鍵約束
-- MySQL
ALTER TABLE orders DROP FOREIGN KEY fk_order_customer;
-- SQL Server / PostgreSQL
ALTER TABLE orders DROP CONSTRAINT fk_order_customer;