1. 程式人生 > >資料庫(2)——資料型別及表的約束

資料庫(2)——資料型別及表的約束

資料型別及表的約束

一、資料型別

  

下面我將對以下幾種型別進行分析:

1、數值型別

(1)bit的使用

bit[(m)]:m可以不寫,預設值為1m的範圍:0-64.bitASCII碼的形式展示,所有我們可以遇到不可見字元。

案例:將name屬性設定為bit1),則其所能容納的只有01,我們採用臨界值比較法對其進行驗證,結果如下。

          

                    

(2)tinyint的使用

tinyint[unsigned]預設為帶符號的,表示範圍:-128-127,若為無符號則範圍為:0-255.

案例(1):驗證tinyint的預設範圍及預設是否帶符號。

由下述結果,我們可以得出

tinyint預設範圍為:-128-127,且為帶符號。

         

案例(2):驗證tinyint unsigned的範圍

由以下結果可以得出,無符號的tinyint範圍為:0-255.

           

(3)float的使用

float[(m,d)]m指定顯示的長度,d為指定顯示小數位的長度。且float也可以指定為無符號(unsigned.

案例:設定salary6,2)進行驗證。

分析salary表示的最大範圍:-9999.99-9999.99

通過以下結果,可以發現,當指定長度時,若超過範圍則無法插入成功,且MySQL在儲存值時採用四捨五入的方式。

      

(4)decimal的使用

decimal(m,d):m為指定顯示的長度,d為指定顯示小數位數的長度。m被省略預設為10d被省略預設為0.

decimalfloat很相似,不同之處就是表示的精度不一樣,decimal表示的精度比較大,float表示的精度大概為7位,而decimal整數位數最大為65位,小數位數最大為30位。

      

由上圖我們可以看出floatdecimal的精度不同,decimal的精度比較大,若我們希望小數的精度高時就採用decimal

文字、二進位制型別

(1)char的使用

     charL):固定長度字串,L表示可存長度,單位:字元。最大255個字元。

(2)varchar的使用

varchar

L:可變長度字串,L表示字元長度,最大長度為65535個位元組。與字符集的設定有關。

uft8:一個字元三個位元組。

gb2312:一個字元兩個位元組。

     

案例:charvarchar的使用

     

charvarchar的區別:

儲存空間比較:

實際儲存

char4

Varchar(4)

char佔用位元組

varchar佔用位元組

Abcd

Abcd

Abcd

4*3=12

4*3+1=13

a

a

a

4*3=12

1*3+1=4

Abcde

×

×

資料超過長度

資料超過長度

char:定長,會造成空間浪費,但效率高。

varchar:變長,節省空間,效率相對較低。

3、時間日期型別

(1)datatime:時間日期格式,“yyyy-mm-dd HH-ii-ss”佔八個位元組

(2)data:日期格式,“yyyy-mm-dd”佔三個位元組

(3)timestamp:時間戳,與datatime格式相同“yyyy-mm-dd HH-ii-ss”,佔四個位元組。會自動修改為當前的資料,只要對錶中任意資料進行修改時間戳都會改為最後修改的時間。

插入資料時,時間戳會自動填補為當前時間。

  

修改資料:修改資料時,時間戳會更新為當前時間。

        

4、String型別

(1)列舉enum

enum('選項1','選項2','選項3',...);enum其實就是“單選”型別,對應介面或表單中的“單選項”的資料值。

該設定只是提供了若干個選項的值,終一個單元格中,實際只儲存了其中一個值;而且,處於效率考慮,這些值 實際儲存的是“數字”,因為這些選項,每個選項值,一次對應如下數字:1,2,3,....65535個。

(2)集合set

set('選項值1','選項值2','選項值3', ...);set就是“多選”型別,對應於介面或表單的“多選項”的資料值。

該設定只是提供了若干個選項的值,終一個單元格中,設計可儲存了任何其中的多個值;而且,處於效率考慮, 這些實際儲存的是“數字”,因為這些選項,每個選項值,一次對應如下數字:1,2,4,8,16,32....64個。

        

通過插入操作發現,我們只可以插入我們建立表時定義的資料,而不能插入定義之外的資料。

我們在對錶中的資料進行查詢:

        

由此我們可以得出在對列舉進行查詢時可使用我們之前使用的select * from 表名 where 滿足條件的子句,而對集合進行資料查詢時要使用find_in_set來進行查詢,否則查詢不到正確的結果。

二、表的約束

真正約束欄位的是資料型別,但是資料型別約束很單一,需要有一些額外的約束,更好的保證資料的合法性,從業務邏輯角度保證資料的正確性。

(1)空屬性

兩個值:nullnot null,資料庫預設欄位基本都是為空(null),但在實際中,我們儘可能使之不為空,因為無法參加運算。

案例:建立一個表,包含學號和姓名,且都不為空,因為沒有學號不知道姓名,沒有姓名也不會知道學號(排除同名問題)。

      

插入元素時若插入空元素則會插入不成功:

          

(2)預設值

預設值:某一種資料會經常性的出現某個具體的值,可以在一開始就指定好,在需要真實資料的時候,使用者可以選擇性的使用預設值。Setenum不能指定預設值。

     

當資料在插入時不給定欄位的值則是預設值就生效。

      

(3)列描述

列描述:comment,沒有實際含義,用來描述欄位表示的含義,會根據表建立語句儲存,用來給程式設計師或DBA來進行了解。

     

通過show我們可以看出列描述:

     

(4)Zerofill格式化

其實在不加zerofill的時候,int10)中的10是沒有任何意義的,而在加了zerofill後,則顯示的10位不夠10位的用0補齊。

   

同樣插入10,而看到num1的值是0000000010,而num2的值時是10,這就是zeroll屬性的作用,如果寬度小於設定的寬度(這裡設定的是10),自動填充0。要注意的是,這只是後顯示的結果,在MySQL中實際儲存的還是10。為什麼是這樣呢?我們可以用hex函式來證明。

                     

(5)主鍵

主鍵:primary key用來唯一的約束該欄位裡面的資料,不能重複,不能為空,主鍵所在的列是整數型別;一張表中多隻能有一個主鍵。

定義主鍵的三種方式:

1)建立表的時候直接在欄位上指定主鍵

          

2)在建立表的時候,在所有欄位之後,使用primary key(主鍵欄位列表)來建立主鍵,如果有多個欄位作為主鍵,可以使用複合主鍵。

    

複合主鍵:

     

3)當表建立好以後,可以再次追加主鍵

      

刪除主鍵:alter table 表名 drop primary key不需要指定主鍵的欄位,因為主鍵是唯一的。

               

(6)自增長

auto_increment:當對應的欄位,不給值,會自動的被系統觸發,系統會從當前欄位中已經有的最大值+1操作,得到一個新的不同的值。通常和主鍵搭配使用,作為邏輯主鍵。

特點:任何一個欄位要做自增長,前提是本身是一個索引(key一欄有值) 自增長欄位必須是整數 一張表多隻能有一個自增長。

    

以下例項可以表明自增長只增不長,不會因為刪除資料自增長的值而減小。

                    

(7)唯一鍵

一張表中有往往有很多欄位需要唯一性,資料不能重複,但是一張表中只能有一個主鍵:唯一鍵就可以解決表中有 多個欄位需要唯一性約束的問題。

唯一鍵的本質和主鍵差不多,唯一鍵允許為空,而且可以多個為空,空欄位不做唯一性比較。