據(jù)庫(kù)原理及運(yùn)用(初識(shí))第五節(jié):#外鍵與外鍵約束)
歡迎回來(lái)本篇文章為不了解數(shù)據(jù)庫(kù)或者將要學(xué)數(shù)據(jù)庫(kù)卻不知道它具體是什么的伙伴們介紹數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí)同時(shí)小編也會(huì)用每一小節(jié)學(xué)到的新知識(shí)一步一步搭建出一個(gè)完整的大一新生數(shù)據(jù)庫(kù)系統(tǒng)小編爭(zhēng)取每天都會(huì)更新一節(jié)零基礎(chǔ)的小伙伴也可以跟著小編一起搭建自己的一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)前面我們講解了的約束一部分知識(shí)點(diǎn)這一章我們重點(diǎn)講解一下外鍵約束并用實(shí)際案例演示一遍在講解外鍵約束之前我們先在我們史萊克新生數(shù)據(jù)庫(kù)系統(tǒng)里添加一個(gè)記錄我們學(xué)校老師的表格順便演示一下上節(jié)我們學(xué)習(xí)到的約束的用法# 創(chuàng)建具有約束條件的表格我們先來(lái)分析一下一張表格會(huì)用上哪些約束條件首先這個(gè)表格中要有id他就像我們每個(gè)人的省份證號(hào)一樣是我們身份的一種證明標(biāo)識(shí)他必須具備唯一性同時(shí)我還希望他能夠自動(dòng)增長(zhǎng)最好這樣我們就不用在創(chuàng)建表格時(shí)一個(gè)一個(gè)的輸入id了那么要實(shí)現(xiàn)這些需求我們需要用到的約束條件就是‘主鍵’‘自動(dòng)增長(zhǎng)’。他們對(duì)應(yīng)的約束關(guān)鍵字是‘primary key’和‘a(chǎn)uto_increment’。其次表格中還有姓名而考慮到學(xué)校這么多人我們希望姓名不為空就可以了約束關(guān)鍵字為‘not null’然后是年齡和和課程序號(hào)每個(gè)人年齡坑定都是大于0的而且如果沒(méi)有特殊情況的話在座的大部分人年齡應(yīng)該是要小于150的修仙的幾個(gè)先站起來(lái)一下課程序號(hào)也同理所以這里我們需要用檢查約束約束關(guān)鍵字‘check’注意這里的檢查約束需要8.0.16版本之后才具備接著是教授的課程和性別這兩個(gè)就沒(méi)什么要求所以可以不加約束。OK分析完了就讓我們動(dòng)手創(chuàng)建一個(gè)有約束條件的教師表如果大家嫌手動(dòng)建表太麻煩了也可以在MySQL里面直接新建一個(gè)同時(shí)也可以直接選擇表中每個(gè)字段所需要的約束可以看到就算我們?cè)谔砑訑?shù)據(jù)時(shí)沒(méi)有管id他也會(huì)自動(dòng)填寫并且自動(dòng)增加。接著小編在演示一下如果我們填寫的數(shù)據(jù)超過(guò)了約束條件會(huì)怎樣可以看到我們的數(shù)據(jù)一旦超出了約束的范圍執(zhí)行后后就會(huì)報(bào)錯(cuò)。這里我們直接就創(chuàng)建好了一個(gè)由于是條件的教師表## 外鍵與外鍵約束外鍵是用來(lái)讓兩張表的數(shù)據(jù)之間建立連接保證數(shù)據(jù)的一致性和完整性。接下來(lái)大家可以思考一個(gè)問(wèn)題當(dāng)一個(gè)學(xué)校的每一門課是有好幾個(gè)老師教而一個(gè)老師也有可能任教好評(píng)幾門課程那么如果我們把課程信息和老師記錄在一張表上就像我們上面那一張teacher表格一樣那么我們要怎樣表示學(xué)生的選課信息呢這樣兩張表就沒(méi)法很好的表達(dá)出所有信息了。這個(gè)時(shí)候我們就需要把課程信息單獨(dú)用一張表來(lái)記錄。然后我們只需要將學(xué)生選的課的id填在學(xué)生表的課程那一欄就可以了這樣學(xué)生表里面的c_id就與課程表里id產(chǎn)生了關(guān)聯(lián)學(xué)生表叫做子表課程表叫做父表我不過(guò)現(xiàn)在這種關(guān)聯(lián)還只是我們邏輯上的是我們知道課程表id為3的課剛好是某同學(xué)選的課所以我們把3寫在了學(xué)生選課的c_id里但如果某天我們一不小心誤刪了課程表id為3的字段或者那天我們把id為3的表改下名字那豈不是要把所有學(xué)生的課程id全都改一遍這顯然是不可能的為了解決這個(gè)問(wèn)題我們就需要給這兩個(gè)表建立外鍵約束具體語(yǔ)法在上一節(jié)已經(jīng)告訴大家了而有了外間的關(guān)聯(lián)這個(gè)時(shí)候我們?cè)偃h除或者修改course表中的數(shù)據(jù)就會(huì)報(bào)錯(cuò)下面我們補(bǔ)充一下外鍵的刪除和更新行為NO ACTION當(dāng)在父表中刪除/更新對(duì)應(yīng)記錄時(shí)首先檢查該記錄是否有對(duì)應(yīng)外鍵如果有則不允許刪除/更新。RESTRICT當(dāng)在父表中刪除/更新對(duì)應(yīng)記錄時(shí)首先檢查該記錄是否有對(duì)應(yīng)外鍵她果有則不允許刪除/更新。與NO ACTION一致)CASCADE當(dāng)在父表中刪除/更新對(duì)應(yīng)記錄時(shí)首先檢查該記錄是否有對(duì)應(yīng)外鍵如果有則也刪除/更新外鍵在子表中的記錄。SET NULL當(dāng)在父表中刪除對(duì)應(yīng)記錄時(shí)首先檢查該記錄是否有對(duì)應(yīng)外鍵如果有則設(shè)置子表中該外鍵值為null這就要求該外鍵允許取null)。SET DEFAULT父表有變更時(shí)子表將外鍵列設(shè)置成一個(gè)默認(rèn)的值(Innodb不支持)下面我把外鍵改為了cascade在修改課程表主鍵名試試看可以看到我們又可以修改父表數(shù)據(jù)了我們刪掉了id為7的字段而選了這門課的學(xué)生數(shù)據(jù)也一起被刪除了。那么以上就是這小節(jié)的全部?jī)?nèi)容我們下一節(jié)再見(jiàn)