1.什么是外鍵:
? ? ? 主鍵:是唯一標(biāo)識(shí)一條記錄,不能有重復(fù)的,不允許為空,用來保證數(shù)據(jù)完整性
? ? ??外鍵:是另一表的主鍵,?外鍵可以有重復(fù)的,?可以是空值,用來和其他表建立聯(lián)系用的。所以說,如果談到了外鍵,一定是至少涉及到兩張表。例如下面這兩張表:
上面有兩張表:部門表(dept)、員工表(emp)。Id=Dept_id,而Dept_id就是員工表中的外鍵:因?yàn)閱T工表中的員工需要知道自己屬于哪個(gè)部門,就可以通過外鍵Dept_id找到對(duì)應(yīng)的部門,然后才能找到部門表里的各種字段信息,從而讓二者相關(guān)聯(lián)。所以說,外鍵一定是在從表中創(chuàng)建,從而找到與主表之間的聯(lián)系;從表負(fù)責(zé)維護(hù)二者之間的關(guān)系。
2.外鍵的使用需要滿足下列的條件:(這里涉及到了InnoDB的概念)
? ? ?1.?兩張表必須都是InnoDB表,并且它們沒有臨時(shí)表。
? ? ? 注:InnoDB是數(shù)據(jù)庫(kù)的引擎。MySQL常見引擎有兩種:InnoDB和MyISAM,后者不支持外鍵。
? ? ? 2.?建立外鍵關(guān)系的對(duì)應(yīng)列必須具有相似的InnoDB內(nèi)部數(shù)據(jù)類型。
? ? ? 3.?建立外鍵關(guān)系的對(duì)應(yīng)列必須建立了索引。
? ? ? 4.?假如顯式的給出了CONSTRAINT?symbol,那symbol在數(shù)據(jù)庫(kù)中必須是唯一的。假如沒有顯式的給出,InnoDB會(huì)自動(dòng)的創(chuàng)建。
面試題:你的數(shù)據(jù)庫(kù)用什么存儲(chǔ)引擎?區(qū)別是?
? ? ? 答案:常見的有MyISAM和InnoDB。
? ? ? MyISAM:不支持外鍵約束。不支持事務(wù)。對(duì)數(shù)據(jù)大批量導(dǎo)入時(shí),它會(huì)邊插入數(shù)據(jù)邊建索引,所以為了提高執(zhí)行效率,應(yīng)該先禁用索引,在完全導(dǎo)入后再開啟索引。
? ? ? InnoDB:支持外鍵約束,支持事務(wù)。對(duì)索引都是單獨(dú)處理的,無需引用索引。
? ? ? CONSTRAINT?symbol:可以給這個(gè)外鍵約束起一個(gè)名字,有了名字,以后找到它就很方便了。如果不加此參數(shù)的話,系統(tǒng)會(huì)自動(dòng)分配一個(gè)名字。
? ? ? FOREIGN?KEY:將從表中的字段1作為外鍵的字段。
? ? ? REFERENCES:映射到主表的字段2。
? ? ? ON?DELETE后面的四個(gè)參數(shù):代表的是當(dāng)刪除主表的記錄時(shí),所做的約定。
? ? ? ? ? ?RESTRICT(限制):如果你想刪除的那個(gè)主表,它的下面有對(duì)應(yīng)從表的記錄,此主表將無法刪除。
? ? ? ? ? ?CASCADE(級(jí)聯(lián)):如果主表的記錄刪掉,則從表中相關(guān)聯(lián)的記錄都將被刪掉。
? ? ? ? ? ?SET?NULL:將外鍵設(shè)置為空。
? ? ? ? ? ?NO?ACTION:什么都不做。
? ? ?注:一般是RESTRICT和CASCADE用的最多。
美文美圖
以上就是?MySQL進(jìn)階(一)主外鍵講解的內(nèi)容,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP中文網(wǎng)(www.php.cn)!