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