from:http://webdesign.piipo.com/sql/sql_foreign_key
FOREIGN KEY 外鍵限制 (SQL FOREIGN KEY Constraint)
外鍵是一個(或多個)指向其它資料表中主鍵的欄位,它限制欄位值只能來自另一個資料表的主鍵欄位,用來確定資料的參考完整性 (Referential Integrity)。
讓我們簡單了解一下什麼是外鍵...
這是一個客戶資料表「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
假設我們要將「customer」資料表中的「C_Id」欄位設為外鍵:
在建立資料表同時 - CREATE TABLE...
MySQL
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)
);
如果想在MySQL資料庫中使用外鍵限制,必需讓資料表使用InnoDB儲存引擎。
SQL Server / Oracle / MS Access
CREATE TABLE orders
(
O_Id INT NOT NULL PRIMARY KEY,
Order_No INT NOT NULL,
C_Id INT FOREIGN KEY (C_Id) REFERENCES customers(C_Id)
);
替外鍵命名與多欄位的外鍵
MySQL / SQL Server / Oracle / MS Access
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...
MySQL / SQL Server / Oracle / MS Access
ALTER TABLE orders
ADD FOREIGN KEY (C_Id) REFERENCES customers(C_Id);
替外鍵命名與多欄位的外鍵
MySQL / SQL Server / Oracle / MS Access
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;
留言列表