MySQL學習(二、列類型和數據完整性)

目錄

1、數據類型

1.1 值類型

1.1.1  整型

1.1.2  浮點型(保存近似值小數)

1.1.3  定點數

1.2  字符型

1.3  枚舉(enum)

1.4  集合(set)

1.5  日期

1.6  boolean

1.7  練習題

1.8 列屬性——是否爲空(null | not null)

1.9 列屬性——默認值(default)

1.10 列屬性——自動增長(auto_increment)

1.11 列屬性——主鍵(primary key)

1.11.1 添加主鍵

1.11.2 創建組合鍵

1.11.2 查看主鍵

1.11.3  刪除主鍵

1.11.4 選擇主鍵的原則

1.11.5 主鍵思考題

1.12 列屬性——唯一鍵

1.12.1 添加唯一鍵

1.12.2 查看唯一鍵

1.12.3 刪除唯一鍵

1.13 列屬性——備註(comment)

1.14 SQL註釋

1.15 數據完整性介紹

1.15.1 保證實體完整性

1.15.2 保證域完整性

1.15.3 保證引用完整性

1.16 引用完整性

1.16.1 主表和從表

1.16.2 外鍵(foreign key)

1.16.3 添加外鍵

1.16.4 查看外鍵

1.16.5 刪除外鍵

1.17 外鍵操作

1.18 客戶端介紹


1、數據類型

1.1 值類型

1.1.1  整型

       作爲SQL標準的擴展,MySQL也支持整數類型TINYINT、MEDIUMINT和BIGINT。下面的表顯示了需要的每個整數類型的存儲和範圍。

提示:無符號整數(unsigned):無符號沒有負數,正數部分是有符號的兩倍。

整型支持顯示寬度(最小的顯示位數) 比如int(5),如果數值的位數小於5位,前面加上前導0。比如輸入12,顯示00012;大於5位就不添加前導0。

注意:必須結合zerofill才起作用

1.1.2  浮點型(保存近似值小數)

       FLOAT類型用於表示近似數值數據類型。SQL標準允許在關鍵字FLOAT後面的括號內選擇用位指定精度(但不能爲指數範圍)。MySQL還支持可選的只用於確定存儲大小的精度規定。0到23的精度對應FLOAT列的4字節單精度。24到53的精度對應DOUBLE列的8字節雙精度。

浮點型 佔用字節 範圍
float(單精度) 4 -3.4E+38~3.4E+38
double(雙精度) 8 -1.8E+308~1.8E+308

浮點數聲明:float(M,D)     double(M,D) 

M:總位數

D:小數位數

如果精度超過允許範圍,會四捨五入。

超過允許位數範圍會報錯:

浮點數存的是近似值,精度可能丟失。

1.1.3  定點數

decimal(M,D)

定點數是將小數的整數部分和小數部分分開保存,定點數不知道用幾個字節,它是變長的。

1.2  字符型

數據類型 描述 長度
char 定長 最大255
varchar 變長 最大65535
tinytext 大段文本 2^8-1=255
text 大段文本 2^16-1=65535
mediumtext 大段文本 2^24-1
longtext 大段文本 2^32-1

1)char(10)和varchar(10)的區別?

答:相同點:它們最多隻能保存10個字符;

       不同點:char不回收富餘的字符,varchar會回收多餘的字符;

                      char效率高,浪費空間,varchar節省空間,效率比char低。

注意:char的最大長度是255,varchar理論長度是65535字節,實際根本達不到,具體長度與字符編碼有關。

編碼格式不同,實際的長度也不同。

一條記錄的長度不能超過65535.

大塊文本(text)不計算在總長度中,一個大塊文本只佔用10個字節來保存文本的地址。

1.3  枚舉(enum)

從集合中選擇一個數據(單選)

報錯原因:只能插入枚舉值。

MySQL的枚舉類型是通過整數來管理的,第一個值是1,第二個值是2,以此類推。

枚舉的優點:運行速度快(數字比字符串運算速度快);限制數據,保證數據完整性;節省空間。

思考:已知枚舉佔用2個字節,請問最多有多少個枚舉值?

答:2個字節=16位,可以保存數字(0-65535),枚舉是從1開始,所以枚舉最多可以有65535個枚舉值。

1.4  集合(set)

從集合中選擇一些數據(多選)

注意:插入順序不同,但是顯示的順序是一樣的。

插入集合中沒有的選項會報錯。

每個集合的元素都分配一個固定的數字,分配的方式從左往右按2的0、1、2、...次方

思考:已知集合佔用8個字節,最多可以表示幾個選項?

64  (8*8)    8個字節=64位,一個位表示1個選項,最多可以表示64個選項。

如果是多選,他們的關係是按位或。

1.5  日期

數據類型 描述
datetime 日期時間,佔用8個字節
data 日期 佔用3個字節
time 時間 佔用3個字節
timestamp 時間戳 佔用4個字節
year 年份 佔用1個字節

1)datetime

 格式:年-月-日 小時:分鐘:秒

加載不到10000年。

2)date

3)timestamp:時間戳

從1970年0時0分0秒到現在的秒數

timestamp類型和 datetime類型在表現上是一樣的。他們的區別: datetime是從1到9999,而timestamp從1970年~2038年,2038年01月19日11:14:07秒以後就超出timestamp範圍了。

4)year

因爲只佔用1個字節,最多隻能表示255個年份,範圍是1901-2155之間的年份

5)time 表示時間或時間間隔,範圍是-838:59:59~838:59:59

注意:time支持以天的方式插入。

1.6  boolean

MySQL不支持boolean類型,true和false在數據庫中對應1和0。

true和false在數據庫中對應1和0.

1.7  練習題

下列事物用什麼數據類型存儲?

手機號碼    char

電話號碼     varchar

性別           char    enum

人的年齡        tinyint

照片信息       binary(理論)  一般存地址

薪水            decimal

注意:一個字段到底選數字還是字符,取決於有沒有計算的可能,如果沒有計算的可能即使是數字也要用字符類型,比如手機號、QQ號,…

1.8 列屬性——是否爲空(null | not null)

null:可以爲空

not null:不可爲空

思考題:

1)學生姓名允許爲空嗎?  非空

2)家庭地址                        非空

3)電子郵件信息                 可爲空

4)考試成績                        可爲空

1.9 列屬性——默認值(default)

1、如果一個字段沒有插入值,可以默認插入一個指定的值。

2、default關鍵字用來插入默認值

1.10 列屬性——自動增長(auto_increment)

1、字段的值從1開始,每次遞增1,特點就在字段中的數據不可能重複,適合爲記錄生成唯一的id

2、自動增長都是無符號整數。

3、在MySQL中,auto_increment必須是主鍵。但是主鍵不一定是自動增長的。

4、如果要給自動增長列插入數據,使用null關鍵字。

5、自動增長列上的數據被刪除,默認情況下此記錄的編號不再使用。

1.11 列屬性——主鍵(primary key)

主鍵:唯一標識表中記錄的一個或一組列

主鍵的特點:不能重複,不能爲空

一個表只能有一個主鍵,主鍵可以有多個字段組成。

主鍵的作用:

1、 保證數據完整性

2、 加快查詢速度

1.11.1 添加主鍵

1)創建表的時候添加主鍵

注意:

如果插入主鍵相同的數據就會報錯

主鍵不能插入空值

2)創建表的時候添加主鍵

3)更改表的時候添加主鍵

1.11.2 創建組合鍵

1.11.2 查看主鍵

1.11.3  刪除主鍵

1.11.4 選擇主鍵的原則

1、 最少性:儘量選擇一個字段做主鍵

2、 穩定性:儘量選擇更新少的列做主鍵

3、 儘量選擇數字型的列做主鍵

1.11.5 主鍵思考題

1、在主鍵列輸入的數值,允許爲空嗎? 不可以

2、 一個表可以有多個主鍵嗎? 不可以

3、 在一個學校數據庫中,如果一個學校內允許重名的學員,但是一個班級內不允許學員重名,可以組合班級和姓名兩個字段一起來作爲主鍵嗎? 可以

4、 標識列(自動增長列)允許爲字符數據類型嗎? 不可以

5、 表中沒有合適的列作爲主鍵怎麼辦? 添加自動增加列

6、 如果標識列A的初始值爲1,增長量爲1,則輸入三行數據以後,再刪除兩行,下次再輸入數據行的時候,標識值從多少開始? 從4開始

1.12 列屬性——唯一鍵

特點:

1、不能重複,可以爲空

2、一個表可以有多個唯一鍵

作用:

1、 保證數據不能重複。保證數據完整性

2、 加快數據訪問

1.12.1 添加唯一鍵

方法一:創建表的時候添加唯一鍵

方法二:修改表的時候添加唯一鍵

添加一個唯一鍵

添加多個唯一鍵

與上面的不同,添加組合唯一鍵:

還有一種方法

1.12.2 查看唯一鍵

添加唯一鍵,給唯一鍵起名字:

1.12.3 刪除唯一鍵

通過唯一鍵的名字來刪除唯一鍵

alter table 表名 drop index 唯一鍵名稱

eg:

顯示結果:

問題:主鍵和唯一鍵的區別?

1、主鍵不能重複,不能爲空,唯一鍵不能重複,可以爲空

2、主鍵只有一個,唯一鍵可以有多個。

1.13 列屬性——備註(comment)

爲了程序員之間的相互交流

1.14 SQL註釋

單行註釋:--或#

多行註釋:/* */

1.15 數據完整性介紹

1.15.1 保證實體完整性

1、 主鍵約束

2、 唯一約束

3、 自動增長列

1.15.2 保證域完整性

1、 數據類型約束

2、 非空約束

3、 默認值約束

1.15.3 保證引用完整性

1、外鍵約束:從表中的公共字段是主表的外鍵

1.16 引用完整性

1.16.1 主表和從表

兩個表建立關係(兩個表只要有公共字段就有關係),一個表稱爲主表,一個表稱爲從表。

外鍵約束可以實現:

1、 主表中沒有的從表中不允許插入

2、 從表中有的主表中不允許刪除

3、 不能更改主表中的值而導致從表中的記錄孤立存在。

4、 先刪除從表,再刪除主表

1.16.2 外鍵(foreign key)

1、 外鍵:從表中的公共字段,公共字段的名字可以不一樣,但是數據類型必須一樣。

2、 外鍵約束用來保證引用完整性

1.16.3 添加外鍵

方法一:創建表的時候添加外鍵

添加如下字段失敗,因爲在stumarks中的id不是stuinfo的外鍵,主表中沒有該id的信息:

在主表中添加該id信息後,

在從表中才能添加相應的信息:

直接無法刪除主表的信息

必須先刪除從表對應id的信息後方能刪除

總結:主表中沒有的,從表中不允許刪除;從表中有的,主表中不能刪除;不能更改主表的數據後使得從表的數據獨立。

方法二:修改表的時候添加外鍵

注意:要創建外鍵必須是innodb引擎,myisam不支持外鍵約束!!

1.16.4 查看外鍵

外鍵爲:stuid

1.16.5 刪除外鍵

通過外鍵的名字刪除外鍵

mysql 語法:alter table 表名 drop foreign key 外鍵名

從表是:stumarks   主表是stuinfo

1.17 外鍵操作

1、 嚴格操作(前面講的是嚴格操作)

2、 置空操作(set null):如果主表記錄刪除或更新,從表置空

3、 級聯操作(cascade):如果主表記錄刪除或更新,從表級聯

一般來說:主表刪除的時候,從表置空操作,主表更新的時候,從表級聯操作。

mysql 語法:foreign key(外鍵) references 主表(關鍵字段)[主表刪除是的動作][主表更新時候的動作]

1.18 客戶端介紹

第一:命令行

第二:MySQL-Front和Navicat

MySQL-Front

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章