首頁  >  文章  >  資料庫  >  MySQL語句中的主鍵與外鍵怎麼使用

MySQL語句中的主鍵與外鍵怎麼使用

WBOY
WBOY轉載
2023-06-03 12:14:022951瀏覽

     一.主鍵:

    1.1)主鍵欄位定義:

    在資料庫表中,如果有一組欄位能夠唯一確定一條記錄,則可以把它們設計成表格的主鍵欄位。

    範例:如果要建立一個人的資訊表(欄位:姓名,年齡,籍貫,工作單位...),那麼身分證號是唯一能確定你這個人的,所以身分證字號是主鍵。

    1.2) 建立:

    主鍵欄位名稱primary key

    1.3)主鍵的選取原則;

    原則上使用一個欄位做主鍵,而且建議使用沒有業務意義的欄位做主鍵,例如:id等。

    1.4)主鍵值的產生方式:

    主鍵欄位的型別和長度由主鍵值的產生方式來決定:

    1.4.1)

    自增:使用資料庫本身主鍵產生機制
               數值型長度由資料量決定

    建立:主鍵欄位名稱primary key not null auto_increment

    #。

    優點:開發效率高,因為其可自動編號且依序存放便於擷取佔用空間小,可節省開發人員時間。

     缺點: 運作效率低且不靈活,因為其自動成長,在手動要插入或導入指定ID的資料時會很麻煩且如果資料量過大那麼越到後面,資料庫自增主鍵的時間會變長導致查詢資料庫的操作變慢。如果有合併表的操作時,有機率也會出現主鍵的重複。

    1.4.2)

    assighed:程式設計師手動產生主鍵值,唯一非空,演算法.

    hi/low:數值型長度由資料量決定
    UUID :字串長度是32位元

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

    特點:

    優點:主鍵值產生很靈活且能夠保證在任何情況下都具有唯一性,資料遷移方便。                               

     缺點上:佔用空間時長

    1.4.4)

    組合主鍵:由多個欄位的型別和長度決定

     二.外鍵:

    2.1)外鍵定義:

    通常用於在兩個表之間建立關係。外鍵的主要用途是維持實體的兩個獨立實例之間的資料完整性。

    2.2)外鍵(約束)建立(不建議使用,一般不進行外鍵約束,只進行外鍵約定):

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

     2.3)外鍵出現的狀況:

    補充:

     在建立表格的時候,表和表之間可能會存在的業務關係(關聯關係),這時會產生外鍵。

    關聯關係中存在的關係類型:

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

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

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

                  eg:商品的分類表和商品表示一對多的關係,一個商品分類下可以有多個商品,學生和班級

    #多對多:(有兩張表, A表中的一個資料對應B表中的多個條,同時,B表中的一個對應A表中的多個)

                  eg:客戶表及部門表。

     關聯查詢(同時利用外鍵查詢多張表中的資料)

     關聯查詢的類型:

    #內連接:查詢所有符合條件的數據,並且要求結果在兩張表中都有相對應的記錄

    左外連接:查詢左側表中所有符合條件的數據,即使在右側表中沒有相對應的記錄

    右外連接:查詢右側表中所有符合條件的數據,即使在左側表中沒有相對應的記錄

    2.3.1)在一對多中:

    範例:A(1) ---------B(n)

                 父表        子表
    tbl_student                name
    1001    zs    111              111    class1
    1002   ls  ##1003    ww    222
    1004    zl    

     //查询所有姓张的学生的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%'

    張表中有對應的記錄,使用內連結。如果您想要檢索所有符合條件的左側表記錄,可以使用左外連接查詢

     2.3.2)在一对一中:

    tbl_person         tbl_card
    id     name        id     name
    1001   zs          1001    card1

    特点:
    a)共享主键:(不推荐)
    添加数据:先添加先产生的表,再后产生的表记录
    删除数据:先删除后产生的表记录,再删除先产生的表记录
    查询数据:无需进行连接查询:

      //查询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
    特点:

    添加数据时,先添加父表记录(tbl_student,tbl_course),再添加子表(tbl_student_course_relation)记录;
    删除数据时,先删除子表记录(tbl_student_course_relation),再删除父表记录(tbl_student,tbl_course)
    查询数据时,可能会进行关联查询:

      //查询所有姓张的学生的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%'

    三.主键和外键的区别总结:

    MySQL語句中的主鍵與外鍵怎麼使用

    以上是MySQL語句中的主鍵與外鍵怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除