SQL constraint 外鍵(Foreign Key)
先前開發的小系統,都不太喜歡用constraint,怕在匯入或一些從db 下手作業時會很麻煩,不過系統愈做愈大
還是一定要用constraint 這樣才不會因為程式漏做了而造成資料失去完整性或關連
根據 ANSI SQL92 的標準來看,在違 反 integrity constraint 時,資料庫系統可以採取 4 種動作 :
- set NULL,即當 parent table 中 delete 或 update 一筆資料時,foreign table 上的資料是設為 NULL。
- set default,設 foreign key 為 最初的default value。
- cascade,即當 delete 或 update parent table 時,對 foreign table也做 同樣的 delete 或 update。有了cascade 的功能之後,在我們開發 application 就可以節省處理 integrity constraint 的時間了。
- no action (restrict),即當此筆資料存在有 foreign key 時,不允許做 delete 或 update。也就是說必須將此 integrity constraint 除去後才能做 delete 或 update。
Mysql
在INNODB型態下才有支援外來鍵,不然會是設假的,INNODB型態才會檢查是否有違反外來鍵限制,會依ON UPDATE CASCADE(參考主鍵修改,外來鍵會跟著改),ON DELETE SET NULL(參考主鍵刪除,外來鍵會變空值)…等等的CASCADE 限制對table處理
以下的語法是檢查是否符合外來鍵限制條件。0是關掉檢查,1是打開檢查。
SET FOREIGN_KEY_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 1;
以下的例子則是在建立表格時指定外來鍵:
MySQL:
CREATE TABLE ORDERS
(Order_ID integer,
Order_Date date,
Customer_SID integer,
Amount double,
Primary Key (Order_ID),
Foreign Key (Customer_SID) references CUSTOMER(SID));
Oracle:
CREATE TABLE ORDERS
(Order_ID integer primary key,
Order_Date date,
Customer_SID integer references CUSTOMER(SID),
Amount double);
SQL Server:
CREATE TABLE ORDERS
(Order_ID integer primary key,
Order_Date datetime,
Customer_SID integer references CUSTOMER(SID),
Amount double);
以下的例子則是藉著改變表格架構來指定外來鍵:
MySQL:
ALTER TABLE ORDERS
ADD FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid);
Oracle:
ALTER TABLE ORDERS
ADD (CONSTRAINT fk_orders1) FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid);
SQL Server:
ALTER TABLE ORDERS
ADD FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid);
近期留言