mysql設定外鍵限制的方法:可以透過FOREIGN KEY關鍵字來指定外鍵,語法「ALTER TABLE 表格名稱ADD CONSTRAINT 外鍵名稱FOREIGN KEY(列名) REFERENCES 主表名(列名);」。
(推薦教學:mysql影片教學)
(1) 外鍵的使用:
#外鍵的功能,主要有兩個:
一個是讓資料庫自己透過外鍵來確保資料的完整性和一致性
一個就是能夠增加ER圖的可讀性
有些人認為外鍵的建立會為開發時操作資料庫帶來很大的麻煩.因為資料庫有時候會因為沒有通過外鍵的檢測而使得開發人員刪除,插入操作失敗.他們覺得這樣很麻煩
其實這正式外鍵在強制你保證資料的完整性和一致性.這是好事兒.
例如:
有一個基礎資料表,用來記錄商品的所有資訊。其他表都保存商品ID。查詢時需要連表來查詢商品的名稱。單據1的商品表中有商品ID字段,單據2的商品表中也有商品ID字段。如果不使用外鍵的話,當單據1,2都使用了商品ID=3的商品時,如果刪除商品表中ID=3的對應記錄後,再查看單據1,2的時候就會查不到商品的名稱。
當表很少的時候,有人認為可以在程式實現的時候來透過寫腳本來保證資料的完整性和一致性。也就是在刪除商品的操作的時候去檢測單據1,2中是否已經使用了商品ID為3的商品。但當你寫完腳本之後系統有增加了一個單據3 ,他也儲存商品ID找個欄位。如果不用外鍵,你還是會出現查不到商品名稱的狀況。你總不能每增加一個使用商品ID的欄位的單據時就回去修改你偵測商品是否被使用的腳本吧,同時,引入外鍵會使速度和效能下降。
(2) 新增外鍵的格式:
ALTER TABLE yourtablename
ADD [CONSTRAINT 外鍵名稱] FOREIGN KEY [id] (index_col_name , ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
TION RESTRICT}]
說明:
on delete/on update,用於定義delete,update操作.以下是update,delete操作的各種約束類型:
CASCADE:
外鍵表中外鍵欄位值會被更新,或所在的列會被刪除.
RESTRICT:
RESTRICT也相當於no action,即不進行任何操作.即,拒絕父表update外鍵關聯列,delete記錄.
set null:
被父面的外鍵關聯欄位被update ,delete時,子表的外鍵列被設定為null.
而對於insert,子表的外鍵列輸入的值,只能是父表外鍵關聯列已有的值.否則出錯.
外鍵定義服從下列情況:(前提條件)
1)
所有tables必須是InnoDB型,它們不能是臨時表.因為在MySQL中只有InnoDB類型的表才支援外鍵.
2)
所有要建立外鍵的欄位必須建立索引.
3)
對於非InnoDB表,FOREIGN KEY子句會被忽略掉。
注意:
建立外鍵時,定義外鍵名時,不能加引號.
如: constraint 'fk_1' 或constraint "fk_1"是錯誤的
#(3) 查看外鍵:
SHOW CREATE TABLE ***;可以查看到新建的表的程式碼以及其儲存引擎。也就可以看到外鍵的設定.
刪除外鍵:
alter table drop foreign key '外鍵名稱'.
注意:
只有在定義外鍵時,用constraint 外鍵名foreign key ....方便進行外鍵的刪除.
若不定義,則可以:
先輸入:alter table drop foreign key -->會提示出錯.此時出錯訊息中,會顯示foreign key的系統預設外鍵名稱.--->
用它去刪除外鍵.
(4) 範例
實例一:
4.1
CREATE TABLE parent(id INT NOT NULL,
-- type=innodb 相當於engine= innodb
CREATE TABLE child(id INT, parent_id INT,
KEY (parent_id) REFERENCES parent(id)
ON DELETE CASCADE
#);
向parent插入資料後,向child插入資料,插入時,child中的parent_id的值只能是parent中有的資料,否則插入不成功;
刪除parent記錄時,child中的對應記錄也會刪除;-->因為: on delete cascade
更新parent記錄時,不給更新;-->因為沒定義,預設採用restrict.
4.2
若child如下:
mysql>
create table child(id int not null primary key auto_increment,parent_id int,
index par_ind (parent_id),
constraint fk_1 foreign key (parent_id) references
parent) fk_1 foreign key (parent_id) references##parent) update cascade on delete restrict)
type=innodb;
用上面的:
1).
則可以更新parent記錄時,child中的對應記錄也會被更新;-->因為: on update cascade
2).
不能是子表操作,影響父表.只能是父表影響子表.
3).
刪除外鍵:
alter table child drop foreign key fk_1;
新增外鍵:
alter table child add constraint fk_1 foreign key (parent_id) references
parent(id) on update restrict on delete set null;
(5) 多個外鍵存在:
product_order表對其它兩個表有外鍵。
CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, PRIMARY KEY(category, id)) TYPE=INNODB; ##CREATE TABLE Product_order (no INT NOT NULL AUTO_INCRMENT, product_id INT NOT NULL, (6) 說明: ##1.若不宣告更新/刪除,預設採用restrict方式。2.對於外鍵約束,最好是採用:ON UPDATE CASCADE ON DELETE RESTRICT 的方式。
CREATE TABLE customer (id INT NOT NULL,
PRIMAR
主鍵(無),
-- 雙層外鍵
FOREIGN KEY (product_category, Product_id)
刪除限制更新的級聯,且
--單一外鍵
INDEX (customer_id),
所指參考customer(id)) TYPE=INNODB;
以上是mysql中如何設定外鍵約束?的詳細內容。更多資訊請關注PHP中文網其他相關文章!