FOREIGN KEY 外鍵限制 (SQL FOREIGN KEY Constraint)

外鍵是一個 (或多個) 指向其它資料表中主鍵的欄位,它限制欄位值只能來自另一個資料表的主鍵欄位,用來確定資料的參考完整性 (Referential Integrity)。

如果想在 MySQL 資料庫中使用外鍵限制,必需讓資料表使用 InnoDB 儲存引擎。

讓我們簡單了解一下什麼是外鍵:

這是一個客戶資料表 customers

C_IdNameCityAddressPhone
1張一台北市XX路100號02-12345678
2王二新竹縣YY路200號03-12345678
3李三高雄縣ZZ路300號07-12345678

而這是客戶訂單的資料表 orders

O_IdOrder_NoC_Id
125723
273753
375201
410542

在這裡我們會想有一個限制,就是在客戶訂單資料表中的客戶,都一定要在 customers 資料表中存在。所以我們需要在 orders 資料表中設定一個外鍵,再將此外鍵指向 customers 資料表中的主鍵,以確定所有在 orders 資料表中的客戶都存在於 customers 資料表中,才不會有任何幽靈訂單的出現!

FOREIGN KEY Constraint

假設我們要將 orders 資料表中的 C_Id 欄位設為外鍵,並將它關聯到 customers 資料表中的 C_Id:

在建立資料表時 CREATE TABLE...

CREATE TABLE orders (
  O_Id INT NOT NULL,
  Order_No INT NOT NULL,
  C_Id INT,
  PRIMARY KEY (O_Id),
  FOREIGN KEY (C_Id) REFERENCES customers(C_Id) 
);

替外鍵命名與多欄位的外鍵:

CREATE TABLE orders (
  O_Id INT NOT NULL PRIMARY KEY,
  Order_No INT NOT NULL,
  C_Id INT,
  CONSTRAINT fk_Cusomer_Id FOREIGN KEY (C_Id) REFERENCES customers(C_Id) 
);

我們限制 C_Id 為外鍵,CONSTRAINT 後面接著的即是此外鍵的名稱,另一個重點是記得 customers 資料表中需將 C_Id 設為主鍵。

更改資料表限制 ALTER TABLE...

ALTER TABLE orders
ADD FOREIGN KEY (C_Id) REFERENCES customers(C_Id);

替外鍵命名與多欄位的外鍵:

ALTER TABLE orders
ADD CONSTRAINT fk_Cusomer_Id FOREIGN KEY (C_Id) REFERENCES customers(C_Id);

移除資料表限制 ALTER TABLE...

MySQL

ALTER TABLE orders DROP FOREIGN KEY fk_Cusomer_Id;

SQL Server / Oracle / MS Access

ALTER TABLE orders DROP CONSTRAINT fk_Cusomer_Id;