FOREIGN KEY 外鍵限制 (SQL FOREIGN KEY Constraint)
外鍵是一個 (或多個) 指向其它資料表中主鍵的欄位,它限制欄位值只能來自另一個資料表的主鍵欄位,用來確定資料的參考完整性 (Referential Integrity)。
如果想在 MySQL 資料庫中使用外鍵限制,必需讓資料表使用 InnoDB 儲存引擎。
讓我們簡單了解一下什麼是外鍵:
這是一個客戶資料表 customers
C_Id | Name | City | Address | Phone |
---|---|---|---|---|
1 | 張一 | 台北市 | XX路100號 | 02-12345678 |
2 | 王二 | 新竹縣 | YY路200號 | 03-12345678 |
3 | 李三 | 高雄縣 | ZZ路300號 | 07-12345678 |
而這是客戶訂單的資料表 orders
O_Id | Order_No | C_Id |
---|---|---|
1 | 2572 | 3 |
2 | 7375 | 3 |
3 | 7520 | 1 |
4 | 1054 | 2 |
在這裡我們會想有一個限制,就是在客戶訂單資料表中的客戶,都一定要在 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;