N个数据库外键实例
因?yàn)橥怄I在數(shù)據(jù)庫(kù)中相對(duì)主鍵比較難理解,主鍵就是唯一標(biāo)識(shí)一條記錄,很好理解;下面來(lái)看N個(gè)外鍵實(shí)例;
1 學(xué)生所屬系
student(s#,sname,d#),即學(xué)生這個(gè)關(guān)系有三個(gè)屬性:學(xué)號(hào),姓名,所在系別。dep(d#,dname),即院系有兩個(gè)屬性:系號(hào)、系名。
則s#、d#是主鍵,也是各自所在關(guān)系的唯一候選鍵,d#是student的外鍵。
建立外鍵的前提: 本表的列必須與外鍵類型相同(外鍵必須是外表主鍵)。
指定外鍵關(guān)鍵字: foreign key(列名)
引用外鍵關(guān)鍵字: references <外鍵表名>(外鍵列名)
事件觸發(fā)限制: on delete和on update , 可設(shè)參數(shù)cascade(跟隨外鍵改動(dòng)), restrict(限制外表中的外鍵改動(dòng)),set Null(設(shè)空值),set Default(設(shè)默認(rèn)值),[默認(rèn)]no action
例如:
outTable表主鍵id 類型 int
創(chuàng)建含有外鍵的表:
create table temp(
id int,
name char(20),
foreign key(id) references outTable(id) on delete cascade on update cascade);
說(shuō)明:把id列 設(shè)為外鍵 參照外表outTable的id列 當(dāng)外鍵的值刪除 本表中對(duì)應(yīng)的列刪除 當(dāng)外鍵的值改變 本表中對(duì)應(yīng)的列值改變。
注:在創(chuàng)建表中增加外鍵的觸發(fā)事件是不行的,
create table temp(
id int,
name char(20),
foreign key(id) references outTable(id));
========
2 學(xué)生-課程-成績(jī)
學(xué)生表(學(xué)號(hào),姓名,性別,班級(jí))其中每個(gè)學(xué)生的學(xué)號(hào)是唯一的,學(xué)號(hào)就是一個(gè)主鍵;
課程表(課程編號(hào),課程名,學(xué)分)
其中課程編號(hào)是唯一的,課程編號(hào)就是一個(gè)主鍵;
成績(jī)表(學(xué)號(hào),課程號(hào),成績(jī))
成績(jī)表中單一一個(gè)屬性無(wú)法唯一標(biāo)識(shí)一條記錄,學(xué)號(hào)和課程號(hào)的組合才可以唯一標(biāo)識(shí)一條記錄,所以學(xué)號(hào)和課程號(hào)的屬性組是一個(gè)主鍵;
成績(jī)表中的學(xué)號(hào)不是成績(jī)表的主鍵,但它和學(xué)生表中的學(xué)號(hào)相對(duì)應(yīng),并且學(xué)生表中的學(xué)號(hào)是學(xué)生表的主鍵,則成績(jī)表中的學(xué)號(hào)是學(xué)生表的外鍵;
同理成績(jī)表中的課程號(hào)是課程表的外鍵;
========
3 身份證號(hào)
表A中有字段(如身份證號(hào))做了主鍵,表B中也有這個(gè)字段(身份證號(hào)),這里的身份證號(hào)一定來(lái)自表A同樣字段里的內(nèi)容,那么表B的這個(gè)字段就叫表A字段的外鍵,也就是兩個(gè)表以身份證號(hào)這個(gè)字段建立了聯(lián)系。表A中身份證號(hào)字段里面的身份證號(hào)一定是唯一的,不能有重復(fù),而表B里面的同一個(gè)身份證號(hào)可以出現(xiàn)多次。這稱為表A身份證號(hào)字段與表B身份證號(hào)字段建立了一對(duì)多的關(guān)系。
外鍵的作用就是可以讓身份證號(hào)保證是來(lái)自表A中,也就是保證了數(shù)據(jù)的規(guī)范性;如果要?jiǎng)h除A表中的某個(gè)身份證號(hào),那么首先要?jiǎng)h除B表中同樣的身份證號(hào),這保證了數(shù)據(jù)的完整性
========
4 客戶與訂單
a b 兩個(gè)表a表中存有客戶號(hào),客戶名稱
b表中存有每個(gè)客戶的訂單
有了外鍵后
你只能在確信b 表中沒(méi)有客戶x的訂單后,才可以在a表中刪除客戶x
========
5 子表父表的定義和外鍵的作用
子表,父表的定義: 擁有外鍵的表是子表。主鍵被其它表引用的表是父表。換句話說(shuō):因?yàn)楦副淼臉?biāo)識(shí)被很多個(gè)子表中的記錄引用,所以叫父表。
擁有外鍵關(guān)系,并且可以隨便刪除數(shù)據(jù),不影響其它表的數(shù)據(jù)的那個(gè)表叫子表。
使用的時(shí)候誰(shuí)做為誰(shuí)的外鍵,主要從以下兩點(diǎn)考慮:
1/,刪除是如何相互影響的,刪除記錄受約束的那個(gè)是父表,不受約束的那個(gè)是子表;
2/,記錄必須先存在的是父表;
兩種用途:
1/, 最常用的一種: 減少重復(fù)數(shù)據(jù).表A中擁有外鍵,表B的數(shù)據(jù)基本是不允許刪除的.這時(shí)選擇對(duì) INSERT 和 UPDATE 強(qiáng)制關(guān)系即可.
2/,其次,是增加一個(gè)從屬表. 如果表A刪除一條記錄時(shí),表B中也隨著刪除一條相關(guān)聯(lián)的記錄,那么外鍵關(guān)系中,表A的主鍵是表B的外鍵。這種關(guān)系,實(shí)際上表B是表A的從屬表(即表A是父表),選擇對(duì) INSERT 和 UPDATE 強(qiáng)制關(guān)系時(shí),如果向表B中插入數(shù)據(jù),表A中必須
已經(jīng)存在對(duì)應(yīng)的記錄。選擇級(jí)聯(lián)刪除相關(guān)的字段時(shí),刪除表A中的一條記錄,就會(huì)刪除對(duì)應(yīng)的表B中的一條記錄。
========
6 學(xué)生機(jī)房收費(fèi)系統(tǒng)
學(xué)生信息表,卡號(hào)為主鍵;充值表,退卡表,上下機(jī)表,均有卡號(hào)字段,以卡號(hào)為外鍵;
只有當(dāng)學(xué)生注冊(cè)了信息,有了卡號(hào),在學(xué)生信息表中存在了,才可以進(jìn)行充值,退卡,上下機(jī)等,主外鍵的作用也就是當(dāng)沒(méi)有學(xué)生信息時(shí),我們不可以進(jìn)行充值等操作,而且想要?jiǎng)h除學(xué)生信息表中的數(shù)據(jù),必須先將充值表,退卡表,上下機(jī)表中此卡號(hào)的人刪除之后才可以
刪除學(xué)生信息表中的數(shù)據(jù),這樣就避免了當(dāng)學(xué)生未注冊(cè)時(shí),就可以充值的情況
?
? ? 也就是說(shuō),如果主鍵表中數(shù)據(jù)的更改使之與外鍵表中數(shù)據(jù)的鏈接失效,則這種更改是不能實(shí)現(xiàn)的,從而確保了引用完整性。如果試圖刪除主鍵表中的行或更改主鍵值,而該主鍵值與另一個(gè)表的 FOREIGN KEY 約束值相關(guān),則該操作不可實(shí)現(xiàn)。若要成功更改或刪除?
FOREIGN KEY 約束的行,可以先在外鍵表中刪除外鍵數(shù)據(jù)或更改外鍵數(shù)據(jù),然后將外鍵鏈接到不同的主鍵數(shù)據(jù)上去。
?
? ? 外鍵是用來(lái)控制數(shù)據(jù)庫(kù)中數(shù)據(jù)的數(shù)據(jù)完整性的 。就是當(dāng)你對(duì)一個(gè)表的數(shù)據(jù)進(jìn)行操作和他有關(guān)聯(lián)的一個(gè)或更多表的數(shù)據(jù)能夠同時(shí)發(fā)生改變,這就是外鍵的作用
========
7 連接查詢與主外鍵的關(guān)系
?? ? 連接的 連接條件:A表的主鍵 = B表的外鍵如果做連接的兩表沒(méi)有主外鍵關(guān)系,那么連接結(jié)果沒(méi)有意義。
?
? ? 例:學(xué)生表和選課表做連接,select *from 學(xué)生表,選課表where 學(xué)生表.學(xué)號(hào)(主鍵)=選課表.學(xué)號(hào)(外鍵)
?
? ? 主外鍵可以建級(jí)聯(lián)級(jí)觸發(fā)器,用來(lái)做級(jí)聯(lián)刪除、更新。作用原理還是因?yàn)橹魍怄I將兩表聯(lián)系。
========
8 Person和Order
"Persons" 表:Id_P LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing
"Orders" 表:
Id_O OrderNo Id_P
1 77895 3
2 44678 3
3 22456 1
4 24562 1
請(qǐng)注意,"Orders" 中的 "Id_P" 列指向 "Persons" 表中的 "Id_P" 列。
"Persons" 表中的 "Id_P" 列是 "Persons" 表中的 PRIMARY KEY。
"Orders" 表中的 "Id_P" 列是 "Orders" 表中的 FOREIGN KEY。
FOREIGN KEY 約束用于預(yù)防破壞表之間連接的動(dòng)作。
FOREIGN KEY 約束也能防止非法數(shù)據(jù)插入外鍵列,因?yàn)樗仨毷撬赶虻哪莻€(gè)表中的值之一。
========
9 設(shè)備管理信息系統(tǒng)
表1:device設(shè)備表?序號(hào) ? 列名 ? ? ? 數(shù)據(jù)類型 ? 長(zhǎng)度 ? 主外鍵 ? 允許空 ? 說(shuō)明 ?
1 ? ? ?de_no ? ? ?varchar ? ?50 ? ? 主鍵 ? ? 否 ? ? ? 設(shè)備編號(hào)?
2 ? ? ?de_name ? ?varchar ? ?50 ? ? ? ? ? ? ?否 ? ? ? 設(shè)備名稱?
3 ? ? ?de_brand ? varchar ? ?50 ? ? ? ? ? ? ?否 ? ? ? 品牌?
4 ? ? ?de_btime ? varchar ? ?50 ? ? ? ? ? ? ?是 ? ? ? 購(gòu)買時(shí)間?
5 ? ? ?de_ptime ? varchar ? ?50 ? ? ? ? ? ? ?是 ? ? ? 生產(chǎn)時(shí)間?
表3:remian_device可用設(shè)備表 ?
序號(hào) 列名 ? ? ? ? 數(shù)據(jù)類型 長(zhǎng)度 主外鍵 ?允許空 ?說(shuō)明 ?
1 ? ?remian_num ? int ? ? ?4 ? ?主鍵 ? ?否 ? ? ?序號(hào)?
2 ? ?de_no ? ? ? ?varchar ?50 ? 外鍵 ? ?否 ? ? ?設(shè)備編號(hào)?
3 ? ?de_name ? ? ?varchar ?50 ? ? ? ? ? 否 ? ? ?設(shè)備名稱
4 ? ?de_condition varchar ?50 ? ? ? ? ? 是 ? ? ?設(shè)備狀態(tài) ? ?
表4:repair_device設(shè)備維修情況表 ?
序號(hào) ?列名 ? ? ? ? ? ? ?數(shù)據(jù)類型 ?長(zhǎng)度 ?主鍵 ?允許空 ?說(shuō)明 ?
1 ? ? repair_num ? ? ? ?int ? ? ? 4 ? ? 主鍵 ?否 ? ? ?序號(hào) ?
2 ? ? st_no ? ? ? ? ? ? varchar ? 50 ? ? ? ? ?否 ? ? ?維修員工編號(hào)?
3 ? ? de_no ? ? ? ? ? ? varchar ? 50 ? ?外鍵 ?否 ? ? ?設(shè)備編號(hào)?
4 ? ? destroy_date ? ? ?varchar ? 50 ? ? ? ? ?否 ? ? ?損壞日期?
5 ? ? repair_condition ?varchar ? 50 ? ? ? ? ?是 ? ? ?維修狀態(tài)?
設(shè)備表以de_no為主鍵;
可用設(shè)備表以de_no為外鍵;
設(shè)備維修情況表以de_no為外鍵;
========
10 人力資源管理系統(tǒng)
員工表
列名 ? ? ? ? 數(shù)據(jù)類型及長(zhǎng)度 ?可否為空 ?說(shuō)明 ?
BNO ? ? ? ? ?CHAR(6) ? ? ? ? NOT NULL ?員工號(hào)(主鍵)?
BNAME ? ? ? ?VARCHAR(10) ? ? NULL ? ? ?員工姓名?
BGENDER ? ? ?VARCHAR(2) ? ? ?NULL ? ? ?性別?
BBIRTHDAY ? ?DATE ? ? ? ? ? ?NULL ? ? ?出生日期?
BHOMETOWN ? ?VARCHAR(8) ? ? ?NULL ? ? ?籍貫?
BNATION ? ? ?VARCHAR(10) ? ? NULL ? ? ?民族?
BID ? ? ? ? ?CHAR(2) ? ? ? ? NULL ? ? ?身份證號(hào)?
BHEALTH ? ? ?VARCHAR(20) ? ? NULL ? ? ?健康狀況?
BZZMM ? ? ? ?VARCHAR(4) ? ? ?NULL ? ? ?政治面貌?
BBLOOD ? ? ? VARCHAR(2) ? ? ?NULL ? ? ?血型?
BHOMEADRESS ?VARCHAR(10) ? ? NULL ? ? ?家庭住址?
BTELENO ? ? ?CHAR(10) ? ? ? ?NULL ? ? ?聯(lián)系電話
學(xué)歷表 ? ?
列名 ? ? ?數(shù)據(jù)類型及長(zhǎng)度 ? 可否為空 ? ? 說(shuō)明 ?
CNO ? ? ? CHAR(6) ? ? ? ? ? NOT NULL ? ?員工號(hào)(外鍵)?
CGREENO ? CHAR(15) ? ? ? ? ?NOT NULL ? ?學(xué)位證書編號(hào)(主鍵)?
CXL ? ? ? CHAR(6) ? ? ? ? ? NULL ? ? ? ?學(xué)歷?
CAJOR ? ? VARCHAR(10) ? ? ? NULL ? ? ? ?專業(yè)?
CBYDATE ? DATE ? ? ? ? ? ? ?NULL ? ? ? ?畢業(yè)時(shí)間?
CBYSCHOOL VARCHAR(20) ? ? ? NULL ? ? ? ?畢業(yè)院校?
部門表
列名 ? 數(shù)據(jù)類型及長(zhǎng)度 ? ?可否為空 ? ?說(shuō)明
DNO ? ?CHAR(6) ? ? ? ? ? NOT NULL ? ?員工號(hào)(外鍵)?
DDNO ? CHAR(6) ? ? ? ? ? NOT NULL ? ?部門號(hào)(主鍵)?
DNAME ?VARCHAR(10) ? ? ? NULL ? ? ? ?部門名稱?
DADD ? VARCHAR(20) ? ? ? NULL ? ? ? ?部門地址?
DTIME ?DATE ? ? ? ? ? ? ?NULL ? ? ? ?參加工作時(shí)間?
此例中,
員工表,員工號(hào)為主鍵;
學(xué)歷表,學(xué)位證書編號(hào)為主鍵;員工號(hào)關(guān)聯(lián)員工表,為外鍵;
部門表,部門號(hào)為主鍵;員工號(hào)關(guān)聯(lián)員工表,為外鍵;
總結(jié)
- 上一篇: 绕过web认证学习总结
- 下一篇: 图解微软ReportBuilder3连接