溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL語句中的主鍵和外鍵怎么使用

發(fā)布時間:2023-04-19 14:30:13 來源:億速云 閱讀:121 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“MySQL語句中的主鍵和外鍵怎么使用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“MySQL語句中的主鍵和外鍵怎么使用”吧!

     一.主鍵:

    1.1)主鍵字段定義:

    在數(shù)據(jù)庫表中,如果有一組字段能夠唯一確定一條記錄,則可以把它們設(shè)計成表的主鍵字段。

    例子:如果要創(chuàng)建一個人的信息表(字段:姓名,年齡,籍貫,工作單位......),那么身份證號是唯一能確定你這個人的,所以身份證號是主鍵。

    1.2) 創(chuàng)建:

    主鍵字段名 primary key

    1.3)主鍵的選取原則;

    原則上使用一個字段做主鍵,而且推薦使用沒有業(yè)務(wù)含義的字段做主鍵,比如:id等。

    1.4)主鍵值的生成方式:

    主鍵字段的類型和長度由主鍵值的生成方式來決定:

    1.4.1)

    自增:借助數(shù)據(jù)庫自身主鍵生成機制
               數(shù)值型 長度由數(shù)據(jù)量來決定

    創(chuàng)建:主鍵字段名 primary key not null auto_increment

    特點:

    優(yōu)點:開發(fā)效率高,因為其可以自動編號且按順序存放便于檢索占用空間小,可以節(jié)省開發(fā)人員時間。

     缺點: 運行效率低且不靈活,因為其自動增長,在手動要插入或?qū)胫付↖D的數(shù)據(jù)時會很麻煩且如果數(shù)據(jù)量過大那么越到后面,數(shù)據(jù)庫自增主鍵的時間會變長導(dǎo)致查詢數(shù)據(jù)庫的操作變慢。如果有合并表的操作時,有概率還會出現(xiàn)主鍵的重復(fù)。

    1.4.2)

    assighed:程序員手動生成主鍵值,唯一非空,算法.
    hi/low:數(shù)值型 長度由數(shù)據(jù)量決定
    UUID:字符串 長度是32位

    public class UUIDUtil {//java中自帶UUID的算法
        public static  String getUUID(){
            return UUID.randomUUID().toString().replaceAll("-", "");
        }
    }

    特點:

    優(yōu)點:主鍵值生成很靈活且能夠保證在任何情況下都具有唯一性,數(shù)據(jù)遷移方便。                               

     缺點:占用空間大,很難記憶,會降低性能。

    1.4.4)

    聯(lián)合主鍵:由多個字段的類型和長度決定

     二.外鍵:

    2.1)外鍵定義:

    通常用于在兩個表之間建立關(guān)系。外鍵的主要用途是維持實體的兩個獨立實例之間的數(shù)據(jù)完整性。

    2.2)外鍵(約束)創(chuàng)建(不推薦使用,一般不進(jìn)行外鍵約束,只進(jìn)行外鍵約定):

    alert table 主鍵表名 add constraint FK_ID(外鍵名稱) foreign key(外鍵字段名) references 外表表名(主鍵字段名)

     2.3)外鍵出現(xiàn)的情況:

    補充:
     在創(chuàng)建表的時候,表和表之間可能會存在的業(yè)務(wù)關(guān)系(關(guān)聯(lián)關(guān)系),這時會產(chǎn)生外鍵。

    關(guān)聯(lián)關(guān)系中存在的關(guān)系類型:

    1對1:一張表(A)中的一條記錄只能對應(yīng)另一張表(B)中的一條記錄,另一張表(B)中的一條記錄也只能對應(yīng)一張表(A)中的一條記錄。 

                  eg:軟工2777班和班長,公民和身份證。(商品表和該商品的描述表)

    1對多:一張表(A)中的一條記錄可以對應(yīng)另一張表(B)中的多條記錄,另一張表(B)中的一條記錄只能對應(yīng)一張表(A)中的一條記錄。

                  eg:商品的分類表和商品表示一對多的關(guān)系,一個商品分類下可以有多個商品,學(xué)生和班級

    多對多:(有兩張表,A表中的一條數(shù)據(jù)對應(yīng)B表中的多條,同時,B表中的一條對應(yīng)A表中的多條)

                  eg:客戶表和部門表。

     關(guān)聯(lián)查詢(同時利用外鍵查詢多張表中的數(shù)據(jù))

     關(guān)聯(lián)查詢的類型:

    內(nèi)連接:查詢所有符合條件的數(shù)據(jù),并且要求結(jié)果在兩張表中都有相對應(yīng)的記錄

    左外連接:查詢左側(cè)表中所有符合條件的數(shù)據(jù),即使在右側(cè)表中沒有相對應(yīng)的記錄

    右外連接:查詢右側(cè)表中所有符合條件的數(shù)據(jù),即使在左側(cè)表中沒有相對應(yīng)的記錄

    2.3.1)在一對多中:

    例子:A(1)---------B(n)
                 父表         子表
    tbl_student                    tbl_class
    id      name class_id          id     name
    1001    zs    111              111    class1
    1002    ls    111              222    class2
    1003    ww    222
    1004    zl    

     //查詢所有姓張的學(xué)生的id,name和所在班級name
                                                 select s.id,s.name,c.name as className
                                                 from tbl_student s
                                                  join tbl_class c on s.class_id=c.id//假如外鍵不可以為空
                                                  where s.name like 'z%'

    張表中有相對應(yīng)的記錄,使用內(nèi)連接。 ,假如需要查詢左側(cè)表中所有符合條件的記錄,使用左外連接.

     2.3.2)在一對一中:

    tbl_person         tbl_card
    id     name        id     name
    1001   zs          1001    card1

    特點:
    a)共享主鍵:(不推薦)
    添加數(shù)據(jù):先添加先產(chǎn)生的表,再后產(chǎn)生的表記錄
    刪除數(shù)據(jù):先刪除后產(chǎn)生的表記錄,再刪除先產(chǎn)生的表記錄
    查詢數(shù)據(jù):無需進(jìn)行連接查詢:

      //查詢zhangsan的駕照信息  1001
                       select *
                       from tbl_card
                       where id='1001'

    2.3.3)多對多:

    tbl_student                    tbl_course
    id     name                    id     name   
    1001   zs                      111    java   
    1002   ls                      222    mysql  
    tbl_student_course_relation
    student_id     course_id
    1001            111
    1001            222
    1002            111
    1002            222
    特點:

    添加數(shù)據(jù)時,先添加父表記錄(tbl_student,tbl_course),再添加子表(tbl_student_course_relation)記錄;
    刪除數(shù)據(jù)時,先刪除子表記錄(tbl_student_course_relation),再刪除父表記錄(tbl_student,tbl_course)
    查詢數(shù)據(jù)時,可能會進(jìn)行關(guān)聯(lián)查詢:

      //查詢所有姓張的學(xué)生的id,name,和所選課程的name
                  select s.id,s.name,c.name as courseName
                  from tbl_student s
                              join tbl_student_course_relation scr on s.id=scr.student_id
                              join tbl_course c on scr.course_id=c.id
                  where s.name like 'z%'

    三.主鍵和外鍵的區(qū)別總結(jié):

    MySQL語句中的主鍵和外鍵怎么使用

    感謝各位的閱讀,以上就是“MySQL語句中的主鍵和外鍵怎么使用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對MySQL語句中的主鍵和外鍵怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI