【附:MYSQL中文指南 http://c.biancheng.net/view/2441.html】
原文鏈接:https://www.cnblogs.com/whylinux/p/9905134.html
1.什么是外鍵
A表的主鍵丛版,在B表中字段出現(xiàn)疹味,就是外鍵。
2.什么是約束:約束是一種限制虑瀑,它通過對(duì)表的行貨列的數(shù)據(jù)做出限制,來確保表的數(shù)據(jù)的完整性、唯一性。比如人員表中有一列是部門id轮蜕,當(dāng)新增一個(gè)人員的時(shí)候,我們不需要手動(dòng)的在部門id字段給這個(gè)人員設(shè)置一個(gè)部門蝗锥,而是新增則個(gè)新人員記錄的時(shí)候默認(rèn)就會(huì)有一個(gè)部門id給了這個(gè)人員跃洛,這就是約束。
3.以上1和2結(jié)合一起就是外鍵約束终议。即:foreign key
4.具體操作
4.1創(chuàng)建表時(shí)汇竭,同時(shí)創(chuàng)建外鍵約束
4.2已創(chuàng)建表后,追加外鍵約束
(1)添加外鍵方法
-- CONSTRAINT 就是創(chuàng)建外鍵約束 fk_id是外鍵約束的名字-- foreign key (dept_id) references dept(did)意思是設(shè)置person表中的dept_id字段和dept表中的did字段關(guān)聯(lián)穴张,dept表中的did字段就是person表中的dept_id的外鍵約束细燎,這個(gè)外鍵約束的名字叫做fk_id,一般潛規(guī)則外鍵約束的名字開頭是fk_altertablepersonaddCONSTRAINTfk_idforeignkey(dept_id)REFERENCESdept(did);
此時(shí)可以發(fā)現(xiàn)在person表中的皂甘,點(diǎn)擊外鍵按鈕玻驻,可以看到創(chuàng)建出來的外鍵
欄位表示的是person表中的dept_id字段,參考欄位的did就是person表中的dept_id字段的約束偿枕,dept_id字段的值被約束為dept字段did字段的值
? 主表就是外鍵約束有約束值的那個(gè)表
從表就是被約束的那個(gè)表
(2)外鍵約束的4種類型璧瞬,RESTRICT、NO ACTION渐夸、CASCADE嗤锉、SET NULL主要針對(duì)于外鍵里的刪除時(shí)和更新時(shí)
RESTRICT(約束):如果出現(xiàn)在刪除時(shí),意思是約束外鍵主鍵did記錄(主表中的記錄)不能直接刪除捺萌,必須先刪除被約束的表(從表)字段中dept_id所有這個(gè)外鍵主鍵值對(duì)應(yīng)的記錄,才能刪除外鍵約束(主表中的記錄)
NO ACTION:
CASCADE:刪除選擇這個(gè)時(shí),刪除主表中的記錄時(shí)桃纯,主表中的這個(gè)主鍵id關(guān)聯(lián)的從表的這個(gè)id值所在的記錄也會(huì)被刪除酷誓。建議不選。
SET NULL :刪除選擇這個(gè)時(shí)态坦,如果從表(被約束的字段所在的表中)被約束的字段的值設(shè)置為可以為空時(shí)盐数,那么當(dāng)刪除主表的記錄時(shí),主表中被刪除的這個(gè)記錄對(duì)應(yīng)的主鍵值(約束從表字段的那個(gè)值)在從表中對(duì)應(yīng)的字段中出現(xiàn)的那個(gè)記錄的被約束字段的值就會(huì)變?yōu)镹ULL伞梯。
最常用的是選擇RESTRICT不讓刪的這個(gè)約束玫氢、或者選擇SET NULL刪除后值表為空。
目前公司都不太喜歡使用這種真實(shí)的外鍵約束谜诫,而是使用虛擬的外鍵約束漾峡。虛擬外鍵約束:就是人員表中的部門id字段中的id值是部門表中的主鍵id的值,這就是虛擬外鍵約束喻旷,也是目前來說比較流行使用的生逸。
(3)刪除外鍵
-- 刪除外鍵約束altertablepersonDROPforeignkeyfk_id;
5.其他約束類型
-- 向t5表中插入兩條記錄,第二值用的都是默認(rèn)值且预,如果是默認(rèn)值則可以不填或填defaultinsertintot5values(3,DEFAULT), (4,DEFAULT);