資料庫中外鍵的作用

2021-07-24 06:35:12 字數 1274 閱讀 5354

為了一張表記錄的資料不要太過冗餘。這和軟體工程的模組化思想差不多類似,只不過在資料庫中是對錶關係進行解耦,盡量讓表 記錄的資料單一化。就如你貼的中,把成績和學生資訊放在一張表中就太冗餘了,成績完全可以以學生的id作為區分標識。

你想想,你的圖中的第一章表分割成了表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中的多個欄位是表1的外來鍵;或者說表1的多個外來鍵是在多個表中

。都可以。因為表1的外來鍵不一定是表2的主鍵,也可以是唯一鍵(unique)。比如表2有個主鍵 a,有個唯一鍵 b,表1兩個字段 a' 和 b』 分別引用表2的 a 和 b,這就是多對多的關係了。再或者表2主鍵 a,表3主鍵 b,表1的兩個字段 a' 和 b' 分別引用表2的 a 和表3 的 b。

這個外來鍵可以不是表1的主鍵,但必須是子表的主鍵。(簡單的說就是,如果乙個欄位是某個表的外來鍵時,那麼該欄位必須是主鍵)

因為你前面就理解錯了,所以這句話本身就是錯的。對於從表來說,外來鍵不一定需要作為從表的主鍵,外來鍵也不一定是外表的主鍵,外表的唯一鍵就可以作 為從表的外來鍵。

資料庫中外鍵知識

class tweet db.model tablename tweets user id db.column db.integer,db.foreignkey users.id class user db.model tablename users tweets db.relationship t...

資料庫中外鍵的作用以及和主鍵的區別

外來鍵是資料庫一級的乙個完整性約束,就是資料庫基礎理論書中所說的 參照完整性 的資料庫實現方式。外來鍵屬性當然是可以去掉的,如果你不想再用這種約束,對程式設計當然不會有什麼影響,但相應的錄入資料的時候就不對錄入的資料進行 參照完整性 檢查了。例如有兩個表 a a,b a為主鍵,b為外來鍵 來自於b....

mysql中外鍵的作用和舉例

1 基本介紹 外來鍵作用 使兩張表形成關聯,外來鍵只能引用外表中的指定列的值!建立外來鍵的前提 本表的列必須與外來鍵型別相同 外來鍵必須是外表的主鍵 指定外來鍵關鍵字 foreign key 列名 引用外來鍵關鍵字 references 外來鍵表名 外來鍵列名 事件觸發限制 on delete和on...