有一個東西一直在我腦海中是個很煩的東西,但是這東西不搞清楚會阻礙自己的前進。自己做項目demo永遠只能用一張表...
所以今天還是學習了下外鍵希望能夠搞明白一些...
百度上搜索外鍵的作用"保持數據的完整性,一致性","參照完整性"...什么的,我想信很多小伙伴都不明白到底什么意思.
首先我么要搞明白,為什么要使用外鍵,
比如有兩張表(在最下面我會附上表的創建SQL語句,以及外鍵的添加和關聯刪除時候的語句)
表一(student1)有字段:stu_id(學號),stu_name(姓名),stu_gender(性別),stu_nation(民族),stu_idcard(身份證號)
表二(score1) 有字段:stu_id(學號),stu_chinese(語文成績),stu_math,stu_english,stu_pe(體育成績)
通過關聯stu_id,就可以把表一表二在操作的時候可以拼湊成一張大表,
字段::stu_id(學號),stu_name(姓名),stu_gender(性別),stu_nation(民族),stu_idcard(身份證號),stu_chinese(語文成績),stu_math,stu_english,stu_pe(體育成績)
不用外鍵的話,貌似也可以正常操作,比如,你可以任意添加給任何一張表任何信息,但是如果有了外鍵(student1的stu_id引用score1中的stu_id)
你就不能先給student1執行insert操作,因為student1中的stu_id和score1中的stu_id有關聯
所以就必須得先給score1表賦值INSERT INTO score1 VALUES('201890001',95,88,97,95);
隨后才能夠INSERT INTO student1 VALUES('201890001','張三','男','漢','123468744123597014');因為在insert給student1表的時候,stu_id必須與之前賦值給score1表中的一致,也就是說
給從表賦值的時候,關聯的字段值必須在主表中能找到!否則就添加失敗,這就是外鍵的作用!
比如:如果我給score1中添加了學號為1的一名學生的學生成績,當我給student1表中添加了一個學號為2的學生信息的時候,是添加不成功的,因為沒有關聯上,除非score1中有學號為2的學生成績信息。只有這樣,才能夠有參照作用,所以才保證了參照完整性。
補充:什么是從表,什么是主表,student1中有語句 CONSTRAINT fk_stu_id_score1 FOREIGN KEY(stu_id) REFERENCES score1(stu_id) 就意味着,score1是主表,student1是從表(雖然我也經常頭暈...但想着,主表的關聯字段必須是主鍵,它就大一點,它就是主表把~...)
剛剛提到了,主表的關聯字段必須是主鍵。是這么個意思:student1中的stu_id和score1中的stu_id關聯,score是主表,stu_id必須是score1表的主鍵,而stu_id在student1中是不是主鍵無所謂。
接下來就是主外鍵關聯刪除的刪除:
score中的信息刪除時候,從表student1中的關聯信息怎么解決,比如主表中學號為1的學生成績信息被刪除了,那么從表student1中的學號為1的學生信息怎么辦,有三種解決方式:
1、禁止刪除(不允許刪除,會報錯)
2、將參照要刪除數據的子表對應數據置空。(從表中學號為1的學生信息為空,null)在創建外鍵的后面加上 ON DELETE SET NULL(后面會附上練習表的創建語句)
3、將參照要刪除數據的子表對應數據刪除。(從表中學號為1的學生信息刪除)在創建外鍵的后面加上 ON DELETE CASCADE
注意如果是置空或者刪除的話,要注意能不能刪除或者置空,比如你設置了那個字段是NOT NULL,主表刪除的時候,從表中的也會刪除,但是從表中你又定義了NOT NULL,所以就會報錯。這也是發 現的一個報錯的原因...
(
其實我寫到這才發現我練習的主外鍵關聯對應的表有邏輯問題,應該再score1上添加外鍵,讓student1當主表,score1當從表,所以當student1中學號為1的學生信息刪除了,score1從表中學號為1的數據怎么辦?當然是刪除了,你 學生都沒了(比如退學),還要保存他的成績信息干什么?當然這都是題外話,我也懶得從頭再改了,相信大家應該看得懂。邏輯翻轉想一下就會明白,
或者說,有一個表示會員表,一個表是訂單表,
會員表要引用訂單表中的信息,他們通過會員ID字段關聯,當會員表中的某一個會員信息刪除了,根據正常需要,基本都是把訂單表中對應的信息也刪除了,因為你會員都沒了要保存訂單信息干什么?所以就是上述的第三種解決方式,
)
好了,回歸到之前的假設場景,student1是從表,score1是主表,將錯就錯下去吧...
我覺得明白了以上的概念邏輯后,其他的能稍微想通一些了吧,比如寫sql語句報錯的時候就能明白為什么要先這樣,才能那樣。。。接下來我附上我練習實驗用的表的sql語句.
1 USE test; 2 3 /*要先刪除從表,才能刪除主表(從表中需要引用主表中的字段,先刪除主表,那么從表就不成立因為從表中還有着和主表的關聯關系)*/ 4 DROP TABLE IF EXISTS student1; 5 DROP TABLE IF EXISTS score1; 6 7 CREATE TABLE score1( 8 stu_id VARCHAR(50) NOT NULL, 9 stu_chinese DOUBLE, 10 stu_math DOUBLE, 11 stu_english DOUBLE, 12 stu_pe DOUBLE, 13 CONSTRAINT pk_stu_id_score1 PRIMARY KEY(stu_id) 14 ); 15 CREATE TABLE student1( 16 stu_id VARCHAR(50), 17 stu_name VARCHAR(50), 18 stu_gender VARCHAR(5), 19 stu_nation VARCHAR(50), 20 stu_idcard VARCHAR(50) NOT NULL, 21 CONSTRAINT pk_stu_idcard_student1 PRIMARY KEY(stu_idcard), 22 CONSTRAINT fk_stu_id_score1 FOREIGN KEY(stu_id) REFERENCES score1(stu_id) ON DELETE CASCADE 23 ); 24 25 /*下面兩條插入語句順序顛倒會報錯*/ 26 INSERT INTO score1 VALUES('201890001',95,88,97,95); 27 INSERT INTO student1 VALUES('201890001','張三','男','漢','123468744123597014');
這是我學習時候參考的兩個網頁地址
1.https://www.cnblogs.com/bhlsheji/p/5332910.html
2.https://blog.csdn.net/bisal/article/details/20898055
歡迎大家討論下啊,我也是初學希望多多指教,有哪里不對的請指出討論一下~謝謝...