1. 程式人生 > >mysql外來鍵理解

mysql外來鍵理解

一個班級的學生個人資訊表:

\

什麼是外來鍵

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

 

外來鍵用來幹什麼

 

為了一張表記錄的資料不要太過冗餘。

這和軟體project的模組化思想差點兒相同類似,僅僅只是在資料庫中是對錶關係進行解耦,儘量讓表 記錄的資料單一化。就如你貼的圖片中,把成績和學生資訊放在一張表中就太冗餘了。

 

為什麼說外來鍵能保持資料的一致性、完整性

 

你想想,你的圖中的第一章表切割成了表1和表2,表2的學號引用了表1的學號欄位作為外來鍵,假設不建立外來鍵,僅僅是和表1一樣單純性地設立一個學號欄位,那麼和建立外來鍵有什麼差別呢?

比方表1中張三的學號為20140900001。那麼我在表2中插資料的時候在學號欄位插20140900001來記錄張三的成績不也是做到了表的解耦了嗎?

這裡存在的問題是,在不設定外來鍵的情況下。表2的學號欄位和表1的學號欄位是沒有關聯的。僅僅是你自己覺得他們有關係而已,資料庫並不覺得它倆有關係。也就是說,你在表2的學號欄位插了一個值(比方20140999999),可是這個值在表1中並沒有,這個時候,資料庫還是同意你插入的,它並不會對插入的資料做關係檢查。然而在設定外來鍵的情況下,你插入表2學號欄位的值必需要求在表1的學號欄位能找到。同一時候,假設你要刪除表1的某個學號欄位,必須保證表2中沒有引用該欄位值的列,否則就沒法刪除。

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

 

外來鍵的使用規則

從表的欄位必須與外來鍵型別同樣(如上,分數表 stu 的型別必須和學生表 sid 的型別同樣,比方都是 int(10) 型別);外來鍵必須是主表的唯一鍵(如上,學生表 sid 是主鍵,而主鍵是唯一的,所以能夠作為分數表 stu 的外來鍵);有關聯的欄位(如上,分數表之所以使用學生表的 sid 是由於兩者有關聯。分數表記錄的是學生的分數,而學生能夠用 sid 來唯 一標識);避免使用複合鍵(也就是說從表能夠同一時候引用多個主表的欄位作為一個外來鍵,一般不推薦這樣的做法)。

 

外來鍵不一定須要作為從表的主鍵。外來鍵也不一定是主表的主鍵。主表的唯一鍵就能夠作為從表的外來鍵。

 

 

1、外來鍵是屬於約束的一種,所謂約束顧名思義,就是限制你在資料庫的操作。

 

而你對資料庫有什麼操作,無非是增、刪、改、查。外來鍵起的作用就是讓你在資料庫幫助的情況下更合理的新增資料的正確度。 2、所以,外來鍵僅僅是輔助,假設A表的id欄位設定為B表id的外來鍵。僅僅是建立了一種約束關係,在建表的時候,即使A表id欄位建立後,B表也要建立id欄位。

3、外來鍵的作用是可以避免例如以下情況。

如 【班級資訊表】存放的是班級資訊表。

【學生表】存放的是學生資訊,包括班級資訊。

這個時候 在【學生表】中存放的班級資訊應該在【班級資訊表】存在才合法,自己人為控制的話難免有漏掉的情況,用外來鍵則可以讓資料庫自己主動控制,當插入【學生表】中的資料在【班級資訊表】不存在的時候,資料庫不同意插入。

 

建立方法
能夠在建立表的時候建立,也能夠在建立表之後建立。
建立表時建立:
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)