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;

 

smileALin 發表在 痞客邦 留言(0) 人氣()