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)



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM