mysql外鍵理解

一個班級的學生我的信息表:數據庫

\

什麼是外鍵

在設計的時候,就給表1加入一個外鍵,這個外鍵就是表2中的學號字段,那麼這樣表1就是主表,表2就是子表

外鍵用來幹什麼

爲了一張表記錄的數據不要太過冗餘。模塊化

這和軟件project的模塊化思想差點兒相同相似,僅僅只是在數據庫中是對錶關係進行解耦,儘可能讓表 記錄的數據單一化。就如你貼的圖片中,把成績和學生信息放在一張表中就太冗餘了。post

爲何說外鍵能保持數據的一致性、完整性

你想一想,你的圖中的第一章表切割成了表1和表2,表2的學號引用了表1的學號字段做爲外鍵,假設不創建外鍵,僅僅是和表1同樣單純性地設立一個學號字段,那麼和創建外鍵有什麼差異呢?spa

比方表1中張三的學號爲20140900001。那麼我在表2中插數據的時候在學號字段插20140900001來記錄張三的成績不也是作到了表的解耦了嗎?設計

這裏存在的問題是,在不設置外鍵的狀況下。表2的學號字段和表1的學號字段是沒有關聯的。僅僅是你本身以爲他們有關係而已,數據庫並不以爲它倆有關係。也就是說,你在表2的學號字段插了一個值(比方20140999999),但是這個值在表1中並無,這個時候,數據庫仍是贊成你插入的,它並不會對插入的數據作關係檢查。然而在設置外鍵的狀況下,你插入表2學號字段的值必須要求在表1的學號字段能找到。同一時候,假設你要刪除表1的某個學號字段,必須保證表2中沒有引用該字段值的列,不然就無法刪除。圖片

這就是所謂的保持數據的一致性和完整性。你想,假設表2還引用表1的某個學號,你卻把表1中的這個學號刪了,表2就不知道這個學號相應的學生是哪一個學生。數據的一致性還包含數據類型的一致性(這個見如下就知道了)。get

外鍵的使用規則

從表的字段必須與外鍵類型一樣(如上,分數表 stu 的類型必須和學生表 sid 的類型一樣,比方都是 int(10) 類型);外鍵必須是主表的惟一鍵(如上,學生表 sid 是主鍵,而主鍵是惟一的,因此可以做爲分數表 stu 的外鍵);有關聯的字段(如上,分數表之因此使用學生表的 sid 是因爲二者有關聯。分數表記錄的是學生的分數,而學生可以用 sid 來惟 一標識);避免使用複合鍵(也就是說從表可以同一時候引用多個主表的字段做爲一個外鍵,通常不推薦這樣的作法)。

外鍵不必定需要做爲從表的主鍵。外鍵也不必定是主表的主鍵。主表的惟一鍵就可以做爲從表的外鍵。it



一、外鍵是屬於約束的一種,所謂約束顧名思義,就是限制你在數據庫的操做。

而你對數據庫有什麼操做,無非是增、刪、改、查。外鍵起的做用就是讓你在數據庫幫助的狀況下更合理的添加數據的正確度。 二、因此,外鍵僅僅是輔助,假設A表的id字段設置爲B表id的外鍵。僅僅是創建了一種約束關係,在建表的時候,即便A表id字段創建後,B表也要創建id字段。io

三、外鍵的做用是能夠避免例如如下狀況。table

如 【班級信息表】存放的是班級信息表。

【學生表】存放的是學生信息,包括班級信息。

這個時候 在【學生表】中存放的班級信息應該在【班級信息表】存在才合法,本身人爲控制的話不免有漏掉的狀況,用外鍵則可讓數據庫本身主動控制,當插入【學生表】中的數據在【班級信息表】不存在的時候,數據庫不一樣意插入。

創建方法
可以在建立表的時候建立,也可以在建立表以後建立。
建立表時建立:
create table student
(id int  primary key,
name char(4),
dept char(9)
sex char(4))

create table grade
(id int ,
grade int
constraint id_fk foreign key (id) references student (id)
)

或建立了兩表以後再建
alter table grade
add constraint id_fk  foreign key (id) references student (id)
相關文章
相關標籤/搜索