1. 程式人生 > 其它 >MySQL 5.7 學習之路 · 啟示錄 · 卷 · Ⅳ ( 簡單瞭解一下 SQLyog 的主鍵、列的屬性、資料型別 等... )

MySQL 5.7 學習之路 · 啟示錄 · 卷 · Ⅳ ( 簡單瞭解一下 SQLyog 的主鍵、列的屬性、資料型別 等... )

Ⅰ、主鍵( Primary Key )& 自增( Auto-Increment )

  一. 簡單描述一下什麼是主鍵 ?

         

         1. 當建立一個表時,可以將某個欄位設定為主鍵( Primary Key ),即:唯一標識

          舉個栗子:

               1.學生表 ( 學號,姓名,性別,院校,專業 ) ,可想而知,一個學校的每一個學生的學號都是唯一的,學號就是一個主鍵

               2. 課程表 ( 課程程式碼,課程名稱,課程性質,學分 ) ,而課程程式碼是唯一的,即課程程式碼就是一個主鍵

1. 本文件建議讀者在所有的表中使用主鍵,但並非必須

2. 在使用時,我們一般會將主鍵同時設定成自增【特殊情況除外】

               

         

         2.主鍵起到了一個唯一標識的作用,保證我們可以安全的更改或刪除表中指定的某一行( 沒主鍵,這個操作就很麻煩 )

         3.MySQL 會把主鍵單獨拿出來,存為一個索引,進行某種規則的排序後儲存起來,方便後續的查詢

小提示:
      1. 我們一般首選整數型 (int) 列的資料作為主鍵,字元型( varchar )次之
      
      2. 舉個栗子:在學校中查詢一個人,查詢學號肯定是最準確、最方便,也最快速的方式

      3. int 是固定的 4 個位元組,char 在 1 ~ 255 位元組之間,首選 int,佔用空間小,節省 CPU 開銷
      4. 在使用中,通常會在主鍵上建立索引,使用整形可以將更多的索引載入記憶體,從而提高效能
      
      5. 使用 int 才可以使用 AUTO_INCREAMENT( 自增 ),見第 四 點

      6. int 雖好,卻也會導致鎖競爭等問題,但總的來說利大於弊,感興趣的讀者可以自行研究

  二、主鍵的設計遵循那些原則 ?

         1. 唯一的標識一行( 即不允許重複 )

         2.作為一個可以被外來鍵有效引用的物件。

         3. 一個表中最多隻有一個主鍵,聯合主鍵見第四點

         4. 主鍵無關序列,可以是一張表中的任何一個序列,但不能是 NULL 值( 一般由 整形 或 字串 的列表示主鍵 )

       

如圖所示,我們將 identityCard ( 身份證號 ) 設定成了 varchar 型別【注意要指定長度】,並將其設為了主鍵

注意:
     1. 本文件不建議使用這麼糟糕的主鍵

     2. 這次我們沒有使用自增

  三、聯合主鍵也能叫主鍵 ?

        舉個栗子,按照如下表進行採購手機,要怎麼買才不會出錯呢 ?

品牌商 系統 版本 採購配置 價格
小番茄 Android 8 Note 7 4G + 64GB 999
小靈通 Android 8 Note 6 6G + 64GB 999
小風車 Android 8 Note 8 4G + 64GB 999
小番茄 Android 8 Note 8 6G + 32GB 1199
小蜜蜂 Android 8 Note 6 6G + 32GB 1099

         - 品牌商 ,不能作為主鍵,因為製作商旗下有很多不同版本的手機

         - 版本 ,不能作為主鍵,因為同一型號下,不同的品牌商有不同的版本

         - 但是, " 品牌商 " ," 版本 " ," 採購配置 " ,三者聯合在一起,就可以唯一標識一個指定的手機 。

         

注意,聯合主鍵仍然是一個主鍵,這裡是由三個欄位聯合在一起組成的。


如圖所示:

      學校可以通過學號,電話,QQ,微信四種常見方式聯絡到該學生

  四、自增為啥要和主鍵一起講?

         1. 自增( Auto-Increment )

            1. 當整形欄位為主鍵時,一般會同時將其設定為自增( 特殊情況不用設定 )

            2. 意思是插入資料時,由 MySQL 來生成 ID,保證 ID 是自增的( 每次加1 )

         2. 自增的起點

            1. 新建的表,預設從 1 開始

            2. 若表中有資料,從上一個最大值開始

            3. 過號作廢,不會重複

            4. 可以指定起點

            5. 同樣的,此設定也有一些更加深入的問題,建議各位初學者晉級找工作階段再深入研究

如圖所示,身份證號或者學號都是可以作為主鍵的,但是這裡不建議使用自增選項

小提示:非空選項表示在資料錄入時,不能輸入空值


Ⅱ、資料型別

        向表新增一列( 欄位 )時,需要指定列的資料型別,各位讀者可以參考 MySQL 官方的詳細教程,傳送門:https://dev.mysql.com/doc/refman/5.7/en/data-types.html

        1. MySQL 的資料型別大致可以分為 5 類:

小提示:

     1. 如果讀者不確定,或者圖省事,直接用典型的型別即可

     2. 以後可以嘗試更多型別

     3. 如果你想把一個圖片檔案作為一列儲存到資料裡...( 通常這是一個壞主意! )

分類 典型 更多
整數 int( 4 位元組) tinyint,smallint,int,bigint,...
字串 varchar( 可變長度字串【10 KB 以下】,使用時指定最大長度,如:5,19,21,... ) char( 固定長寬字串 32 ),varchar,...
浮點數 double( 8 位元組 ) double,float( 4 位元組 ), ...
日期時間 datetime ( 日期時間,如:2018-6-7 14:07:54) date( 日期 ),time( 時間 ),datetime,timestamp,...
大塊資料 text / blob( 二進位制大物件 ) tinytext,text( 65 KB ),mediumtext( 16 MB ),longtext( 4 GB ),blob( 儲存大段位元組資料 ),...


Ⅲ、列的屬性:列名( Column Name )

  一. 列名的命名規範 ?

         

         1. 本文件不建議使用中文,通常使用英文或拼音,但可以在註釋一列中新增中文提示

         2. 推薦的命名規範:

            • 不要使用 SQL 裡的關鍵詞,如:database,table,...
            • 使用有意義的單詞或者簡寫,如:realName,storePath,...
            • 第一個單詞小寫( 與 Java 相容,減少麻煩 )

      

  二. 列的屬性:

         1.長度( Length )

            • 對於 varchar / text 欄位,需要設定最大長度
            • 不區分中英文,按字元數統計
            • 太長的字串,不適合用varchar儲存 (65K),varchar(512) 和 varchar(1024) 實質沒有差別
            • 對於其他型別,不需要設定長度 (意義不大),例如,:int(4) 表示最小顯示寬度為 4,不足時湊空格 或 0,( 需勾選 ZeroFill 屬性 )

    

         2. 非空( Not NULL )

  • 空值 NULL:指這一列的值尚未設定
  • 當一列設定為 " 非空 " 時,表示該列不允許空值
辨析:其實和 Java 裡的含義相同:
String str
= null; // 空值NULL String str = ""; // 空字串

         3. 預設值 ( Default Value):指的是當新增一行時,若某列的值未設定,則自動填一個預設值。