Mysql中的外鍵分析(什么是外鍵,為什么要用外鍵,添加外鍵,主外鍵關聯刪除)


有一個東西一直在我腦海中是個很煩的東西,但是這東西不搞清楚會阻礙自己的前進。自己做項目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

  歡迎大家討論下啊,我也是初學希望多多指教,有哪里不對的請指出討論一下~謝謝...

 

    

 


免責聲明!

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



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