FOREIGN KEY 外鍵約束

FOREIGN KEY 外鍵用來建立資料表之間的關聯,確保資料的參考完整性(Referential Integrity)。外鍵欄位的值必須存在於另一個資料表的主鍵中。

為什麼需要外鍵?

假設有兩個資料表:

customers 資料表:

idname
1張一
2王二

orders 資料表:

idorder_nocustomer_id
1A0011
2A0022

我們希望 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;