《MySQL數(shù)據(jù)原理與應(yīng)用》 課件 第5章 MySQL數(shù)據(jù)表結(jié)構(gòu)管理_第1頁(yè)
《MySQL數(shù)據(jù)原理與應(yīng)用》 課件 第5章 MySQL數(shù)據(jù)表結(jié)構(gòu)管理_第2頁(yè)
《MySQL數(shù)據(jù)原理與應(yīng)用》 課件 第5章 MySQL數(shù)據(jù)表結(jié)構(gòu)管理_第3頁(yè)
《MySQL數(shù)據(jù)原理與應(yīng)用》 課件 第5章 MySQL數(shù)據(jù)表結(jié)構(gòu)管理_第4頁(yè)
《MySQL數(shù)據(jù)原理與應(yīng)用》 課件 第5章 MySQL數(shù)據(jù)表結(jié)構(gòu)管理_第5頁(yè)
已閱讀5頁(yè),還剩99頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

MySQL數(shù)據(jù)表結(jié)構(gòu)管理第5章通過(guò)本課程的學(xué)習(xí),您將應(yīng)該:了解數(shù)據(jù)庫(kù)的相關(guān)概念熟悉數(shù)據(jù)庫(kù)工具的使用熟悉SQL語(yǔ)言的規(guī)則與規(guī)范熟練掌握MySQL數(shù)據(jù)庫(kù)管理方法熟練掌握MySQL表結(jié)構(gòu)管理方法熟練掌握表記錄的檢索方法熟練掌握視圖與索引的使用方法熟練掌握數(shù)據(jù)處理之增刪改熟練掌握存儲(chǔ)過(guò)程與游標(biāo)的使用方法熟練掌握存儲(chǔ)函數(shù)的應(yīng)用熟練掌握觸發(fā)器的應(yīng)用熟練掌握事務(wù)的基本特性和應(yīng)用場(chǎng)景熟練掌握數(shù)據(jù)庫(kù)安全及管理熟練掌握MySQL數(shù)據(jù)庫(kù)備份和恢復(fù)操作了解利用MySQL+Java開(kāi)發(fā)一個(gè)數(shù)據(jù)庫(kù)學(xué)習(xí)系統(tǒng)并部署課程目標(biāo)項(xiàng)目部署成功本講教學(xué)目標(biāo)熟悉常見(jiàn)的MySQL數(shù)據(jù)類(lèi)型、約束類(lèi)型。掌握如何創(chuàng)建數(shù)據(jù)表掌握查看數(shù)據(jù)表的結(jié)構(gòu)掌握修改數(shù)據(jù)表通過(guò)完成課業(yè)任務(wù)學(xué)會(huì)分析問(wèn)題、解決問(wèn)題,提高動(dòng)手操作能力。通過(guò)本講的學(xué)習(xí),您將可以:1.OPTION2.OPTIONOPTION4.OPTION3.5.OPTIONtb_course表的數(shù)據(jù)添加目錄Content數(shù)據(jù)類(lèi)型01創(chuàng)建數(shù)據(jù)表02修改數(shù)據(jù)表03刪除數(shù)據(jù)表04課業(yè)任務(wù)05常見(jiàn)錯(cuò)誤及解決方案06數(shù)據(jù)類(lèi)型015.1.1MySQL數(shù)據(jù)類(lèi)型介紹數(shù)據(jù)類(lèi)型是指在系統(tǒng)中用于限制或允許該列中存儲(chǔ)的數(shù)據(jù)。在MySQL中,數(shù)據(jù)類(lèi)型主要根據(jù)數(shù)據(jù)值的內(nèi)容、大小、精度來(lái)選擇,給字段選擇合適的數(shù)據(jù)類(lèi)型對(duì)數(shù)據(jù)庫(kù)的優(yōu)化具有很重要的作用;反之,則可能會(huì)嚴(yán)重影響應(yīng)用程序的功能和性能。MySQL支持多種數(shù)據(jù)類(lèi)型,主要分為三種數(shù)據(jù)類(lèi)型:數(shù)值、日期與時(shí)間以及字符串類(lèi)型,其中數(shù)值類(lèi)型又包括整數(shù)類(lèi)型、浮點(diǎn)數(shù)與定點(diǎn)數(shù)類(lèi)型;字符串類(lèi)型包括文本字符串、二進(jìn)制字符串類(lèi)型。MySQL具體包括的數(shù)據(jù)庫(kù)類(lèi)型如下表所示。5.1.2整數(shù)類(lèi)型MySQL中的整數(shù)類(lèi)型分為T(mén)INYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和BIGINT這5個(gè)類(lèi)型。不同的數(shù)據(jù)類(lèi)型存儲(chǔ)空間不同,提供的取值范圍也不同。因?yàn)榇鎯?chǔ)范圍越大,存儲(chǔ)的空間也越大,所以在實(shí)際中需要根據(jù)需求選擇合適的數(shù)據(jù)類(lèi)型,這樣有利于節(jié)約存儲(chǔ)空間以及利于提高查詢效率。MySQL中整數(shù)類(lèi)型的具體區(qū)別如下表所示。5.1.2整數(shù)類(lèi)型

說(shuō)明:在MySQL5.7版本中,整型數(shù)據(jù)類(lèi)型可以在定義表結(jié)構(gòu)時(shí)指定所需要的顯示寬度,如果不指定,則系統(tǒng)為每一種類(lèi)型指定默認(rèn)的寬度值。從MySQL8.0.17開(kāi)始,整數(shù)數(shù)據(jù)類(lèi)型不推薦使用顯示寬度屬性。面對(duì)實(shí)際場(chǎng)景需求時(shí),該如何進(jìn)行選擇?以下是MySQL整數(shù)類(lèi)型的不同場(chǎng)景選擇。(1)TINYINT:一般可用于枚舉數(shù)據(jù),例如系統(tǒng)設(shè)定取值范圍很小且固定的場(chǎng)景;(2)SMALLINT:一般可以用于較小范圍的統(tǒng)計(jì)數(shù)據(jù),例如統(tǒng)計(jì)工廠的固定資產(chǎn)庫(kù)存數(shù)量等;(3)MEDIUMINT:一般可用于較大整數(shù)的計(jì)算,例如車(chē)站每日的客流量等;(4)INT(INTEGER):一般用于取值范圍足夠大,一般情況下不用考慮超限問(wèn)題,用得最多,例如商品編號(hào);(5)BIGINT:一般只有當(dāng)處理特別巨大的整數(shù)時(shí)才會(huì)用到,例如雙十一的交易量、大型門(mén)戶網(wǎng)站點(diǎn)擊量、證券公司衍生產(chǎn)品持倉(cāng)等。5.1.3浮點(diǎn)數(shù)與定點(diǎn)數(shù)類(lèi)型在實(shí)際開(kāi)發(fā)當(dāng)中,會(huì)有很多情況需要存儲(chǔ)的數(shù)據(jù)是有小數(shù)數(shù)值的,這就想要使用到浮點(diǎn)數(shù)類(lèi)型。在MySQL中的浮點(diǎn)數(shù)類(lèi)型主要有兩種,分別單精度浮點(diǎn)數(shù)FLOAT和雙精度浮點(diǎn)數(shù)DOUBLE。1.浮點(diǎn)數(shù)類(lèi)型浮點(diǎn)數(shù)類(lèi)型可以用(M,D)來(lái)表示,其中M稱為精度,表示整數(shù)的位數(shù);D稱為標(biāo)度,小數(shù)的位數(shù)。MySQL中浮點(diǎn)數(shù)類(lèi)型的存儲(chǔ)范圍和取值范圍如下表所示。5.1.3浮點(diǎn)數(shù)與定點(diǎn)數(shù)類(lèi)型2.定點(diǎn)數(shù)類(lèi)型當(dāng)對(duì)精確度要求較高的項(xiàng)目時(shí),則可以使用定點(diǎn)數(shù)類(lèi)型。在MySQL中的定點(diǎn)數(shù)類(lèi)型只有DECIMAL一種類(lèi)型,定點(diǎn)數(shù)也可以用(M,D)來(lái)表示,其中M稱為精度,表示數(shù)據(jù)的總位數(shù);D稱為標(biāo)度,表示數(shù)據(jù)的小數(shù)部分的位數(shù)。MySQL中定點(diǎn)數(shù)類(lèi)型的取值范圍如下表所示。

說(shuō)明:(1)FLOAT和DOUBLE浮點(diǎn)數(shù)類(lèi)型之間的區(qū)別如下:FLOAT占用字節(jié)數(shù)少,取值范圍小。DOUBLE占用字節(jié)數(shù)多,取值范圍也大;(2)當(dāng)浮點(diǎn)數(shù)類(lèi)型不指定數(shù)據(jù)精度時(shí),系統(tǒng)會(huì)默認(rèn)按照實(shí)際計(jì)算機(jī)硬件和操作系統(tǒng)來(lái)決定精度;若指定精度超出浮點(diǎn)數(shù)類(lèi)型的數(shù)據(jù)精度,系統(tǒng)則會(huì)自動(dòng)四舍五入,且正常顯示。5.1.3浮點(diǎn)數(shù)與定點(diǎn)數(shù)類(lèi)型

說(shuō)明:(1)定點(diǎn)數(shù)類(lèi)型是以字符串存儲(chǔ)的;(2)當(dāng)定點(diǎn)數(shù)類(lèi)型不指定M和D時(shí),系統(tǒng)則默認(rèn)為“DECIMAL(10,0)”;(3)若數(shù)據(jù)的精度超出了定點(diǎn)數(shù)類(lèi)型的精度范圍,MySQL系統(tǒng)也會(huì)進(jìn)行四舍五入操作,但會(huì)有警告。浮點(diǎn)數(shù)和定點(diǎn)數(shù)類(lèi)型在實(shí)際場(chǎng)景當(dāng)中,該如何進(jìn)行選擇?以下是MySQL浮點(diǎn)數(shù)和定點(diǎn)數(shù)類(lèi)型的不同場(chǎng)景選擇。定點(diǎn)數(shù)類(lèi)型適合于對(duì)精度要求極高的場(chǎng)景,例如涉及金額計(jì)算的場(chǎng)景。浮點(diǎn)數(shù)類(lèi)型適用于需要取值范圍大,且可容忍微小誤差的科學(xué)計(jì)算場(chǎng)景,例如計(jì)算化學(xué)、分子建模、流體動(dòng)力學(xué)等;5.1.4日期與時(shí)間類(lèi)型MySQL有多種數(shù)據(jù)類(lèi)型用于表示日期和時(shí)間,主要有:YEAR、TIME、DATE、DATETIME和TIMESTAMP類(lèi)型。MySQL的日期和時(shí)間類(lèi)型的日期格式、取值范圍如上表所示。5.1.4日期與時(shí)間類(lèi)型日期與時(shí)間類(lèi)型的主要區(qū)別如下:1.YEAR類(lèi)型MySQL中YEAR類(lèi)型有兩種存儲(chǔ)格式,分別是以4位字符串或數(shù)字格式表示和以2位字符串格式表示。

說(shuō)明:(1)當(dāng)以4位字符串或數(shù)字格式表示時(shí),格式為:“YYYY”,數(shù)值取值范圍為“1901~2155”。(2)當(dāng)以2位字符串格式表示YEAR類(lèi)型時(shí),表示范圍如下表所示。5.1.4日期與時(shí)間類(lèi)型2.DATE類(lèi)型DATE類(lèi)型用于僅需要日期值時(shí),沒(méi)有時(shí)間部分,日期格式為“YYYY-MM-DD”,其中YYYY表示年,MM表示月,DD表示日。

說(shuō)明:(1)若以YYYYMMDD格式表示,則會(huì)被轉(zhuǎn)化為YYYY-MM-DD格式;(2)使用CURRENT_DATE()或者NOW()函數(shù),會(huì)獲取當(dāng)前系統(tǒng)的日期。3.TIME類(lèi)型TIME類(lèi)型用于只需要時(shí)間信息的值,格式為HH:MM:SS。HH表示小時(shí),MM表示分鐘,SS表示秒。5.1.4日期與時(shí)間類(lèi)型

說(shuō)明:(1)如果使用帶有D格式的字符串,例如DHH:MM:SS、DHH:MM等格式,當(dāng)插入字段時(shí),D會(huì)被轉(zhuǎn)化為小時(shí),計(jì)算格式為“D*24+HH”;(2)當(dāng)使用帶有冒號(hào)并且不帶D的字符串表示時(shí)間時(shí),如“12:34:56”,表示當(dāng)天的時(shí)間;不帶有冒號(hào)的字符串或數(shù)字,如“123456”或123456,格式為“HHMMSS”或者HHMMSS,將被自動(dòng)轉(zhuǎn)化為“HH:MM:SS”格式進(jìn)行存儲(chǔ)。如果插入一個(gè)不合法的字符串或數(shù)字,如“12:34:56PM”,或者“1234567”,則會(huì)將其自動(dòng)轉(zhuǎn)化為“00:00:00”進(jìn)行存儲(chǔ)。因?yàn)樵贛ySQL中,時(shí)間類(lèi)型的數(shù)據(jù)是用“HH:MM:SS”格式進(jìn)行存儲(chǔ)和比較的,如果插入的數(shù)據(jù)不符合這個(gè)格式,MySQL會(huì)將其自動(dòng)轉(zhuǎn)換為“HH:MM:SS”格式,如果無(wú)法轉(zhuǎn)換則會(huì)被視為“00:00:00”;(3)使用CURRENT_TIME()或者NOW()函數(shù),會(huì)插入當(dāng)前系統(tǒng)的日期。5.1.4日期與時(shí)間類(lèi)型4.DATETIME類(lèi)型DATETIME類(lèi)型在格式上是DATE類(lèi)型和TIME類(lèi)型的結(jié)合,是在所有類(lèi)型中存儲(chǔ)內(nèi)存最大的,格式為“YYYY-MM-DDHH:MM:SS”或“YYYYMMDDHHMMSS”,其中,YYYY表示年份,MM表示月份,DD表示日期,HH表示小時(shí),MM表示分鐘,SS表示秒。

說(shuō)明:(1)插入DATETIME類(lèi)型的字段時(shí),兩位數(shù)的年份規(guī)則符合YEAR類(lèi)型的規(guī)則;(2)存儲(chǔ)格式類(lèi)同于DATE類(lèi)型的存儲(chǔ)格式,以YYYYMMDDHHMMSS格式的數(shù)字插入DATETIME類(lèi)型的字段時(shí),會(huì)被轉(zhuǎn)化為YYYY-MM-DDHH:MM:SS格式;(3)使用CURRENT_TIMESTAMP()或者NOW()函數(shù),可以向DATETIME類(lèi)型的字段插入當(dāng)前系統(tǒng)的日期和時(shí)間。5.1.4日期與時(shí)間類(lèi)型5.TIMESTAMP類(lèi)型TIMESTAMP類(lèi)型的格式與DATATIME類(lèi)型的格式相同,也可以表示日期和時(shí)間。但與DATATIME類(lèi)型不同的是,TIMESTAMP類(lèi)型在存儲(chǔ)數(shù)據(jù)時(shí)是以UTC(世界標(biāo)準(zhǔn)時(shí)間)格式進(jìn)行存儲(chǔ)的,存儲(chǔ)時(shí)對(duì)當(dāng)前時(shí)區(qū)進(jìn)行轉(zhuǎn)換,查詢時(shí)再轉(zhuǎn)換回當(dāng)前時(shí)區(qū),也就是在不同地區(qū)查詢時(shí)會(huì)顯示不同時(shí)間。

說(shuō)明:(1)當(dāng)插入TIMESTAMP類(lèi)型的字段時(shí),兩位數(shù)值的年份同樣符合YEAR類(lèi)型的規(guī)則條件;(2)TIMESTAMP類(lèi)型表示的時(shí)間范圍要小很多,在插入字段時(shí),不要超出范圍,否則MySQL會(huì)拋出錯(cuò)誤;(3)使用CURRENT_TIMESTAMP()或者NOW()函數(shù),可以向TIMESTAMP類(lèi)型的字段插入當(dāng)前系統(tǒng)的日期和時(shí)間。5.1.4日期與時(shí)間類(lèi)型日期與時(shí)間的數(shù)據(jù)類(lèi)型在實(shí)際場(chǎng)景,該如何選擇?以下是MySQL中日期與時(shí)間類(lèi)型在實(shí)際場(chǎng)景中的選擇。(4)DATATIME占8個(gè)字節(jié),TIMESTAMP占4個(gè)字節(jié),若要求存儲(chǔ)范圍較大時(shí),建議使用DATATIME類(lèi)型。DATETIME類(lèi)型反映的是插入時(shí)當(dāng)?shù)氐臅r(shí)區(qū),不會(huì)因?yàn)樵L問(wèn)用戶時(shí)區(qū)不同顯示的結(jié)果發(fā)生變化,而TIMESTAMP類(lèi)型反映的是訪問(wèn)用戶的時(shí)區(qū),不同時(shí)區(qū)的用戶訪問(wèn)會(huì)顯示不同的結(jié)果。DATATIME和TIMESTAMP比較大小或日期計(jì)算時(shí),TIMESTAMP類(lèi)型會(huì)更快、更方便。(1)若存儲(chǔ)數(shù)據(jù)需要記錄年份,則使用YEAR類(lèi)型;(2)若存儲(chǔ)數(shù)據(jù)只需要記錄時(shí)間,則使用TIME類(lèi)型;(3)若同時(shí)需要記錄日期和時(shí)間,則可以使用TIMESTAMP或者DATETIME類(lèi)型;5.1.5文本字符串類(lèi)型MySQL支持的字符串類(lèi)型包括文本字符串類(lèi)型和二進(jìn)制字符串類(lèi)型,主要用來(lái)存儲(chǔ)字符串?dāng)?shù)據(jù),以及存儲(chǔ)圖片和聲音的二進(jìn)制數(shù)據(jù)。MySQL中的字符串類(lèi)型主要分為CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET等類(lèi)型。MySQL中的字符串?dāng)?shù)據(jù)類(lèi)型主要包括的類(lèi)型如下表所示,其中M表示為其指定長(zhǎng)度。5.1.5文本字符串類(lèi)型每一種文本字符串類(lèi)型的長(zhǎng)度范圍和占用存儲(chǔ)空間都是不同的,那么在實(shí)際應(yīng)用當(dāng)中要考慮好該字段適合的長(zhǎng)度和存儲(chǔ)空間,再選擇合適的數(shù)據(jù)類(lèi)型。1.CHAR與VARCHAR類(lèi)型在MySQL中,CHAR(M)類(lèi)型一般需要先定義字符串長(zhǎng)度,若沒(méi)有指定M,則表示長(zhǎng)度默認(rèn)是1個(gè)字符;而VARCHAR(M)類(lèi)型是定義時(shí)必須指定長(zhǎng)度M,否則會(huì)報(bào)錯(cuò)。

說(shuō)明:(1)當(dāng)檢索到CHAR類(lèi)型的數(shù)據(jù)時(shí),CHAR類(lèi)型字段尾部的空格將被刪除;(2)但VARCHAR類(lèi)型在保存和檢索字段數(shù)據(jù)時(shí),字段尾部的空格仍會(huì)保留。5.1.5文本字符串類(lèi)型那么在實(shí)際場(chǎng)景,CHAR和VARCHAR類(lèi)型該如何進(jìn)行選擇?以下是MySQL中CHAR和VARCHAR類(lèi)型在實(shí)際場(chǎng)景中的選擇。(1)當(dāng)存儲(chǔ)的信息較短,速度要求高時(shí),可以使用CHAR類(lèi)型來(lái)實(shí)現(xiàn),例如班級(jí)號(hào)(01,02...)。反之,則選擇VARCHAR類(lèi)型來(lái)實(shí)現(xiàn);(2)當(dāng)需要固定長(zhǎng)度時(shí),使用CHAR類(lèi)型會(huì)更合適,而VARCHAR類(lèi)型是動(dòng)態(tài)根據(jù)長(zhǎng)度的特性就消失,而且還會(huì)占多一個(gè)長(zhǎng)度信息。由于CHAR類(lèi)型平均占用的空間多于VARCHAR類(lèi)型,所以除了簡(jiǎn)短并且固定長(zhǎng)度的,其他考慮VARCHAR類(lèi)型;(3)在InnoDB存儲(chǔ)引擎中,建議使用VARCHAR類(lèi)型。因?yàn)閷?duì)于InnoDB數(shù)據(jù)表,內(nèi)部的行存儲(chǔ)格式并沒(méi)有區(qū)分固定長(zhǎng)度和可變長(zhǎng)度列,而且主要影響性能的因素是數(shù)據(jù)行使用的存儲(chǔ)總量,由于VARCHAR類(lèi)型是按實(shí)際長(zhǎng)度進(jìn)行存儲(chǔ)的,這樣節(jié)省空間,所以對(duì)磁盤(pán)I/O和數(shù)據(jù)存儲(chǔ)總量比較好。5.1.5文本字符串類(lèi)型2.TEXT類(lèi)型在MySQL中,TEXT類(lèi)型分為4種,主要包括TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT類(lèi)型,不同的TEXT類(lèi)型保存的數(shù)據(jù)長(zhǎng)度和所占用的存儲(chǔ)空間都不同。當(dāng)在TEXT類(lèi)型字段上保存或查詢數(shù)據(jù)時(shí),與VARCHAR類(lèi)型相同,不會(huì)刪除數(shù)據(jù)尾部的空格。如若在實(shí)際場(chǎng)景中,TEXT類(lèi)型該如何進(jìn)行選擇?以下是MySQL中TEXT類(lèi)型在實(shí)際場(chǎng)景中的選擇。(3)當(dāng)字符數(shù)大于5000時(shí),建議使用TEXT類(lèi)型,并且新建一個(gè)表進(jìn)行存儲(chǔ),避免影響索引查詢的效率。

(1)當(dāng)TEXT列保存非二進(jìn)制字符串,如文章內(nèi)容、評(píng)論等;(2)在實(shí)際開(kāi)發(fā)當(dāng)中,實(shí)際存儲(chǔ)長(zhǎng)度不確定時(shí),不建議使用TEXT類(lèi)型字段做主鍵;5.1.5文本字符串類(lèi)型3.ENUM類(lèi)型ENUM類(lèi)型又叫作枚舉類(lèi)型,它的取值范圍需要在創(chuàng)建表示通過(guò)枚舉方式進(jìn)行指定,在設(shè)置字段值時(shí),ENUM類(lèi)型只允許從成員中選取單個(gè)值,不能一次選取多個(gè)值,其所需要的存儲(chǔ)空間是由定義ENUM類(lèi)型時(shí)指定的成員個(gè)數(shù)決定。成員個(gè)數(shù)的具體范圍和存儲(chǔ)空間如上表所示,其中L表示實(shí)際成員個(gè)數(shù)。

說(shuō)明:在定義字段時(shí),若ENUM類(lèi)型字段聲明為NULL時(shí),插入NULL是有效值,默認(rèn)為NULL;若ENUM類(lèi)型字段聲明為NOTNULL時(shí),插入NULL為無(wú)效值,默認(rèn)值為ENUM類(lèi)型成員的第一個(gè)成員。4.SET類(lèi)型SET與ENUM類(lèi)型十分相似,SET類(lèi)型也是一個(gè)字符串對(duì)象。與ENUM類(lèi)型不同的是,SET類(lèi)型一次可以選取多個(gè)成員,而ENUM類(lèi)型則只能選取一個(gè)。當(dāng)一個(gè)字符串設(shè)置字段值時(shí),SET類(lèi)型可以取成員個(gè)數(shù)范圍內(nèi)的0個(gè)或多個(gè)值。SET類(lèi)型包含的成員個(gè)數(shù)和存儲(chǔ)空間都不同,具體如表表所示,其中L表示實(shí)際成員個(gè)數(shù)。5.1.5文本字符串類(lèi)型5.1.6二進(jìn)制字符串類(lèi)型在MySQL中,二進(jìn)制字符串類(lèi)型主要存儲(chǔ)二進(jìn)制數(shù)據(jù),例如可以存儲(chǔ)圖片、音頻和視頻等二進(jìn)制數(shù)據(jù)。MySQL中支持的二進(jìn)制字符串類(lèi)型主要包括BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB類(lèi)型。其每種類(lèi)型的長(zhǎng)度以及存儲(chǔ)空間如上表所示,其中M和L都表示值的長(zhǎng)度。1.BIT類(lèi)型BIT類(lèi)型又稱作位字段類(lèi)型,主要存儲(chǔ)的是二進(jìn)制值,類(lèi)似“010110”。若沒(méi)有指定M,默認(rèn)是1位。1位表示只能存1位的二進(jìn)制值。若分配的值的長(zhǎng)度小于M位,則在值的左邊用“0”填充。MySQL中BIT類(lèi)型的長(zhǎng)度范圍和存儲(chǔ)空間如下表所示。5.1.6二進(jìn)制字符串類(lèi)型2.BINARY與VARBINARY類(lèi)型BINARY(M)是固定長(zhǎng)度的二進(jìn)制字符串,如果未指定M,表示只能存儲(chǔ)1個(gè)字節(jié)。若字段值不足M個(gè)字節(jié),將在右邊填充“/0”以補(bǔ)齊指定長(zhǎng)度;反之,超出的部分則會(huì)被截?cái)?。VARBINARY(M)是可變長(zhǎng)度的二進(jìn)制字符串,必須指定M,否則會(huì)報(bào)錯(cuò)。MySQL中BINARY與VARBINARY類(lèi)型的長(zhǎng)度范圍和存儲(chǔ)空間如下表所示。5.1.6二進(jìn)制字符串類(lèi)型3.BLOB類(lèi)型在MySQL中BLOB類(lèi)型包括4種類(lèi)型,主要包括TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB類(lèi)型。BLOB類(lèi)型是一個(gè)二進(jìn)制的對(duì)象,主要用來(lái)存儲(chǔ)可變數(shù)量的數(shù)據(jù),例如圖片、音頻和視頻等。MySQL中BLOB類(lèi)型的長(zhǎng)度范圍和存儲(chǔ)空間如下表所示。5.1.6二進(jìn)制字符串類(lèi)型在實(shí)際開(kāi)發(fā)中,BLOB類(lèi)型與TEXT類(lèi)型該如何選擇?以下是MySQL中BLOB和TEXT類(lèi)型在實(shí)際場(chǎng)景中的選擇。(2)BLOB類(lèi)型的數(shù)據(jù)是以字節(jié)序列的形式存儲(chǔ)的,因此在進(jìn)行排序和比較時(shí),會(huì)基于這些字節(jié)的數(shù)值進(jìn)行操作。TEXT類(lèi)型的數(shù)據(jù)則是以字符序列的形式存儲(chǔ)的,所以在排序和比較時(shí),會(huì)根據(jù)字符集規(guī)則對(duì)這些字符進(jìn)行操作;(3)在實(shí)際工作中,往往不會(huì)在MySQL數(shù)據(jù)庫(kù)中使用BLOB類(lèi)型存儲(chǔ)大對(duì)象數(shù)據(jù),通常會(huì)將圖片、音頻和視頻文件存儲(chǔ)到服務(wù)器的磁盤(pán)上,并將圖片、音頻和視頻的訪問(wèn)路徑存儲(chǔ)到MySQL中。(1)BLOB類(lèi)型存儲(chǔ)的是二進(jìn)制字符串,而TEXT類(lèi)型存儲(chǔ)的是非進(jìn)制字符串;創(chuàng)建數(shù)據(jù)表025.2.1約束概述在MySQL中,約束是指對(duì)表中數(shù)據(jù)的一種約束,能夠幫助數(shù)據(jù)庫(kù)管理員更好地管理數(shù)據(jù)庫(kù),并且能夠確保數(shù)據(jù)庫(kù)中數(shù)據(jù)的完整性。數(shù)據(jù)完整性是指數(shù)據(jù)的精確性和可靠性,是防止數(shù)據(jù)庫(kù)中存在不符合語(yǔ)義規(guī)定的數(shù)據(jù)和防止因錯(cuò)誤信息的輸入輸出造成無(wú)效操作或錯(cuò)誤信息而提出的。例如,在數(shù)據(jù)表中存放身高的值時(shí),如果存入300、400cm這些無(wú)效的值就毫無(wú)意義了,所以使用約束來(lái)限定表中的數(shù)據(jù)范圍是很有必要的。約束可以在創(chuàng)建數(shù)據(jù)表時(shí)規(guī)定約束,執(zhí)行“CREATETABLE”語(yǔ)句,或者在數(shù)據(jù)表創(chuàng)建之后執(zhí)行“ALTERTABLE”語(yǔ)句規(guī)定約束。接下來(lái)講解創(chuàng)建數(shù)據(jù)表時(shí)該如何規(guī)定約束。5.2.2創(chuàng)建數(shù)據(jù)表的語(yǔ)法格式數(shù)據(jù)表是數(shù)據(jù)庫(kù)的重要組成部分,每一個(gè)數(shù)據(jù)庫(kù)都是由若干個(gè)數(shù)據(jù)表組成的。也就是說(shuō),沒(méi)有數(shù)據(jù)表就無(wú)法在數(shù)據(jù)庫(kù)中存放數(shù)據(jù)。所以在創(chuàng)建完數(shù)據(jù)庫(kù)之后,接下來(lái)就要在創(chuàng)建好的數(shù)據(jù)庫(kù)中創(chuàng)建新的數(shù)據(jù)表。創(chuàng)建數(shù)據(jù)表的過(guò)程是規(guī)定數(shù)據(jù)列的屬性的過(guò)程,同時(shí)也是實(shí)施數(shù)據(jù)完整性約束的過(guò)程。在MySQL中創(chuàng)建數(shù)據(jù)表的語(yǔ)法格式如下所示。5.2.2創(chuàng)建數(shù)據(jù)表的語(yǔ)法格式

說(shuō)明:(1)表名稱:表示需要?jiǎng)?chuàng)建數(shù)據(jù)表的表的名稱;(2)字段:規(guī)定數(shù)據(jù)表中列的名稱;(3)數(shù)據(jù)類(lèi)型:規(guī)定數(shù)據(jù)表中列的數(shù)據(jù)類(lèi)型,例如VARCHAR、DATE等;(4)列級(jí)約束條件:指定列級(jí)字段的某些約束條件。在MySQL中創(chuàng)建數(shù)據(jù)表時(shí)需要注意的一些問(wèn)題如下:創(chuàng)建數(shù)據(jù)表時(shí)加上了“IFNOTEXISTS”關(guān)鍵字,則表示:若當(dāng)前數(shù)據(jù)庫(kù)中不存在要?jiǎng)?chuàng)建的數(shù)據(jù)表,則創(chuàng)建數(shù)據(jù)表;如果當(dāng)前數(shù)據(jù)庫(kù)中已經(jīng)存在要?jiǎng)?chuàng)建的數(shù)據(jù)表,則忽略建表語(yǔ)句,不再創(chuàng)建數(shù)據(jù)表;在創(chuàng)建數(shù)據(jù)表時(shí),還需要指定數(shù)據(jù)表中每一列的名稱和數(shù)據(jù)類(lèi)型,多個(gè)列之間需要以逗號(hào)進(jìn)行分隔;在Windows操作系統(tǒng)中,創(chuàng)建數(shù)據(jù)表的表名是不區(qū)分大小寫(xiě)的,但不能使用SQL語(yǔ)言中的關(guān)鍵字,例如INSERT、ALTER、DROP等。5.2.2創(chuàng)建數(shù)據(jù)表的語(yǔ)法格式【案例5.1】創(chuàng)建數(shù)據(jù)表。在數(shù)據(jù)庫(kù)學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(kù)(db_study)中創(chuàng)建一個(gè)數(shù)據(jù)表,名稱為tb_department,用于保存部門(mén)信息,分別給每個(gè)字段選擇合適的數(shù)據(jù)類(lèi)型,具體信息如下表所示。5.2.2創(chuàng)建數(shù)據(jù)表的語(yǔ)法格式在學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(kù)中創(chuàng)建tb_department數(shù)據(jù)表前,需要使用“USE數(shù)據(jù)庫(kù);”語(yǔ)句指定選擇使用的數(shù)據(jù)庫(kù),再創(chuàng)建數(shù)據(jù)表,否則會(huì)報(bào)錯(cuò)。SQL語(yǔ)句如下所示。5.2.2創(chuàng)建數(shù)據(jù)表的語(yǔ)法格式執(zhí)行上述SQL語(yǔ)句,運(yùn)行結(jié)果如下圖所示創(chuàng)建部門(mén)表成功。也可以使用“SHOWTABLES”語(yǔ)句查看數(shù)據(jù)表是否創(chuàng)建成功,由結(jié)果得知,tb_department表已創(chuàng)建成功,執(zhí)行“SHOWTABLES”語(yǔ)句如下圖所示。5.2.3使用非空約束

說(shuō)明:(1)在MySQL中默認(rèn)所有的類(lèi)型的值都可以是NULL;(2)只能某個(gè)列單獨(dú)限定非空,不能組合非空;(3)空字符串’’不等于NULL,0也不等于NULL。非空約束(NotNullConstraint)指的就是數(shù)據(jù)表中某一列的內(nèi)容不允許為空,可以使用“NOTNULL”來(lái)表示,對(duì)于使用了非空約束的手段,如果用戶在添加數(shù)據(jù)時(shí)沒(méi)有指定的值,數(shù)據(jù)庫(kù)系統(tǒng)會(huì)報(bào)錯(cuò)。非空約束的語(yǔ)法格式如下所示。5.2.3使用非空約束【案例5.2】添加非空約束。對(duì)【案例5.1】中的部門(mén)表tb_department進(jìn)行完善,將字段department_id和字段department_name添加為非空,其他字段則默認(rèn)為空。當(dāng)想對(duì)表結(jié)構(gòu)進(jìn)行修改時(shí),則執(zhí)行“DROPTABLE”語(yǔ)句先將數(shù)據(jù)表刪除后再創(chuàng)建。SQL語(yǔ)句如下。5.2.3使用非空約束執(zhí)行上述SQL語(yǔ)句,運(yùn)行結(jié)果如下圖所示。5.2.3使用非空約束由運(yùn)行結(jié)果可以得知:當(dāng)出現(xiàn)“QueryOK”提示信息,則表示成功刪除或創(chuàng)建tb_department數(shù)據(jù)表。也可以執(zhí)行“DESC表名稱;”語(yǔ)句(具體請(qǐng)見(jiàn)5.3.2查看數(shù)據(jù)表結(jié)構(gòu))查看數(shù)據(jù)表的結(jié)構(gòu),發(fā)現(xiàn)department_id和department_name字段已添加了非空約束。

說(shuō)明:在實(shí)際的工作之中,任何的開(kāi)發(fā),當(dāng)表一旦設(shè)計(jì)了,基本就很難做修改。如果真的要進(jìn)行表結(jié)構(gòu)的修改,只有一個(gè)原則:刪除表后重建。但需要給某個(gè)字段添加約束時(shí)可以使用“ALTER”語(yǔ)句進(jìn)行添加(具體請(qǐng)見(jiàn)5.4.3修改字段)。5.2.4使用主鍵約束在MySQL中創(chuàng)建數(shù)據(jù)表時(shí),可以給數(shù)據(jù)表指定主鍵,主鍵又稱為主碼,是表中一列或多列的組合。主鍵約束(PrimaryKeyConstraint)是使用最頻繁的約束,主鍵約束既不能重復(fù)也不能為空,主鍵能夠唯一地標(biāo)識(shí)表中的一條記錄,可以結(jié)合外鍵來(lái)定義不同數(shù)據(jù)表之間的關(guān)系,并且加快數(shù)據(jù)庫(kù)查詢的速度,可以使用“PRIMARYKEY”表示,簡(jiǎn)稱PK。在創(chuàng)建數(shù)據(jù)表時(shí)設(shè)置主鍵約束,可以由一個(gè)字段組成,也可以多個(gè)字段聯(lián)合組成。但是不管使用哪種方法,在一個(gè)表中只能設(shè)置一個(gè)主鍵。以下是單列主鍵和多列聯(lián)合主鍵的語(yǔ)法格式。1.單列主鍵單列主鍵是只包含數(shù)據(jù)表中的一個(gè)字段,MySQL中單列主鍵不僅可以在定義列時(shí)同時(shí)指定主鍵,還可以在定義完所有列之后指定主鍵。單列主鍵的語(yǔ)法格式如下所示。5.2.4使用主鍵約束【案例5.3】添加主鍵約束。對(duì)【案例5.2】中的部門(mén)表tb_department進(jìn)行完善,將字段department_id添加為主鍵,SQL語(yǔ)句如下。2.多列聯(lián)合主鍵多列主鍵是支持多個(gè)字段溝通組成的,但多列聯(lián)合主鍵只能在定義完所有列之后指定。多列聯(lián)合主鍵的語(yǔ)法格式如下所示。5.2.4使用主鍵約束【案例5.3】添加主鍵約束。對(duì)【案例5.2】中的部門(mén)表tb_department進(jìn)行完善,將字段department_id添加為主鍵,SQL語(yǔ)句如下。5.2.4使用主鍵約束執(zhí)行上述SQL語(yǔ)句,運(yùn)行結(jié)果如下圖所示。5.2.4使用主鍵約束當(dāng)數(shù)據(jù)表中不需要指定主鍵約束時(shí),可以執(zhí)行“DROP”語(yǔ)句將其刪除,刪除主鍵約束的語(yǔ)法格式如下所示。

說(shuō)明:(1)表名稱:表示要?jiǎng)h除的主鍵約束的表的名稱;(2)PRIMARYKEY:表示主鍵約束的關(guān)鍵字。由運(yùn)行結(jié)果可以得知:當(dāng)出現(xiàn)“QueryOK”提示信息,則表示成功刪除或創(chuàng)建tb_department數(shù)據(jù)表。也可以執(zhí)行“DESC表名稱;”語(yǔ)句(具體請(qǐng)見(jiàn)5.3.2查看數(shù)據(jù)表結(jié)構(gòu))查看數(shù)據(jù)表的結(jié)構(gòu),發(fā)現(xiàn)department_id字段已添加了主鍵約束。5.2.5使用外鍵約束外鍵約束(ForeignKeyConstraint)是用來(lái)在兩個(gè)表的數(shù)據(jù)之間建立連接,可以使一列或者多列,只要是數(shù)據(jù)表設(shè)計(jì),一定要有外鍵關(guān)系,外鍵是作用在兩張數(shù)據(jù)表上的約束,限定某個(gè)表的某個(gè)字段的引用完整性。一張表的外鍵可以為空,也可以不為空,當(dāng)外鍵不為空時(shí),則每一個(gè)外鍵的值必須等于另一張表的主鍵的某個(gè)值,一張表的外鍵可以不是本表的主鍵,但其對(duì)應(yīng)著另一張表的主鍵。在一張表中定義了外鍵之后不允許刪除另外一張表中具有關(guān)聯(lián)關(guān)系的行數(shù)據(jù)。外鍵是作用在兩個(gè)表中,對(duì)于兩個(gè)具有關(guān)聯(lián)關(guān)系的表而言,又分為主表和從表。主表(父表):兩個(gè)表具有關(guān)聯(lián)關(guān)系時(shí),關(guān)聯(lián)字段中主鍵所在的表為主表;從表(子表):兩個(gè)表具有關(guān)聯(lián)關(guān)系時(shí),關(guān)聯(lián)字段中外鍵所在的表為從表。外鍵約束的語(yǔ)法格式如下所示。5.2.5使用外鍵約束

說(shuō)明:(1)外鍵名:定義外鍵約束的名稱;(2)字段:表示從表需要?jiǎng)?chuàng)建外鍵約束的字段列,可以由多個(gè)列組成;(3)主表名:表示被從表外鍵所依賴的表的名稱;(4)主鍵列:表示被應(yīng)用的表中的列名,也可以由多個(gè)列組成;(5)CONSTRAINT:創(chuàng)建約束的關(guān)鍵字;(6)FROEIGNKEY:表示所創(chuàng)建約束的類(lèi)型為外鍵約束;(7)REFERENCES:表示被約束的列在主表中的某個(gè)列。5.2.5使用外鍵約束【案例5.4】添加外鍵約束。在數(shù)據(jù)庫(kù)學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(kù)(db_study)中創(chuàng)建一個(gè)數(shù)據(jù)表,名稱為tb_class,用于保存班級(jí)信息,將班級(jí)號(hào)設(shè)置為主鍵,部門(mén)號(hào)設(shè)置為外鍵,則班級(jí)表結(jié)構(gòu)如下表所示。在學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(kù)中創(chuàng)建tb_class數(shù)據(jù)表,按照要求添加外鍵約束的SQL語(yǔ)句如下所示。5.2.5使用外鍵約束在學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(kù)中創(chuàng)建tb_class數(shù)據(jù)表,按照要求添加外鍵約束的SQL語(yǔ)句如下所示。5.2.5使用外鍵約束執(zhí)行上述SQL語(yǔ)句,運(yùn)行結(jié)果如下圖所示。5.2.5使用外鍵約束由運(yùn)行結(jié)果可以得知:成功創(chuàng)建tb_class數(shù)據(jù)表后,可以執(zhí)行“DESC表名稱;”語(yǔ)句(具體請(qǐng)見(jiàn)5.3.2查看數(shù)據(jù)表結(jié)構(gòu))查看數(shù)據(jù)表的結(jié)構(gòu),發(fā)現(xiàn)在tb_class表中已將department_id字段添加了外鍵約束。

說(shuō)明:(1)因?yàn)橹鞅硎莟b_department,則必須先創(chuàng)建成功后,才能創(chuàng)建tb_class表,由于案例5.3已創(chuàng)建成功,所以這里才能指定外鍵成功;(2)當(dāng)需要?jiǎng)h除數(shù)據(jù)表時(shí),首先得先刪除從表,再刪除主表。5.2.5使用外鍵約束當(dāng)數(shù)據(jù)表中不需要使用外鍵約束時(shí),可以執(zhí)行“DROP”語(yǔ)句將其刪除,刪除外鍵約束的語(yǔ)法格式如下所示。

說(shuō)明:(1)表名稱:表示要?jiǎng)h除的外鍵約束的表的名稱;(2)字段名:需要?jiǎng)h除字段的外鍵約束的名稱;(3)FOREIGNKEY:表示外鍵約束的關(guān)鍵字。5.2.6使用唯一約束唯一約束(UniqueConstraint)是指數(shù)據(jù)表中某一個(gè)列的數(shù)據(jù)不允許重復(fù)。例如每個(gè)用戶的Email,郵箱地址不允許重復(fù),就使用唯一性約束(UNIQUE)進(jìn)行聲明。唯一約束與主鍵約束相似的是它們都可以確保列的唯一性。不同的是,唯一約束在一個(gè)表中可有多個(gè),并且設(shè)置唯一約束的列允許有空值,但是只能有一個(gè)空值。而主鍵約束在一個(gè)表中只能有一個(gè),且不允許有空值。唯一約束通常設(shè)置在除了主鍵以外的其他列上,語(yǔ)法格式如下所示。

說(shuō)明:UNIQUE:是唯一約束的關(guān)鍵字?!景咐?.5】添加唯一約束。為了避免班級(jí)名稱重名,需要為其添加唯一約束。對(duì)【案例5.4】中的班級(jí)表tb_class進(jìn)行完善,將班級(jí)名稱設(shè)置為唯一約束,SQL語(yǔ)句如下所示。5.2.6使用唯一約束【案例5.5】添加唯一約束。為了避免班級(jí)名稱重名,需要為其添加唯一約束。對(duì)【案例5.4】中的班級(jí)表tb_class進(jìn)行完善,將班級(jí)名稱設(shè)置為唯一約束,SQL語(yǔ)句如下所示。5.2.6使用唯一約束執(zhí)行上述SQL語(yǔ)句,運(yùn)行結(jié)果如下圖所示。5.2.6使用唯一約束由運(yùn)行結(jié)果可以得知:成功創(chuàng)建完tb_class數(shù)據(jù)表后,可以執(zhí)行“DESC表名稱;”語(yǔ)句(具體請(qǐng)見(jiàn)5.3.2查看數(shù)據(jù)表結(jié)構(gòu))查看數(shù)據(jù)表的結(jié)構(gòu),發(fā)現(xiàn)在tb_class表中已將department_id字段添加了外鍵約束。

說(shuō)明:(1)同一個(gè)表可以是某一個(gè)列的值唯一,也可以多個(gè)列組合的值唯一;(2)唯一性約束允許列值為空;(3)在創(chuàng)建唯一約束的時(shí)候,如果不給唯一約束命名,就默認(rèn)和列名相同。5.2.7使用AUTO_INCREMENT自增列在數(shù)據(jù)庫(kù)應(yīng)用中,需要在每次插入記錄時(shí),系統(tǒng)能自動(dòng)生成字段的主鍵值??梢酝ㄟ^(guò)為表主鍵添加“AUTO_INCREMENT”關(guān)鍵字來(lái)實(shí)現(xiàn)。當(dāng)主鍵定義為自增長(zhǎng)后,這個(gè)主鍵的值就不再需要用戶輸入數(shù)據(jù),而由數(shù)據(jù)庫(kù)根據(jù)定義自動(dòng)賦值。每增加一條記錄,主鍵會(huì)自動(dòng)以相同的步長(zhǎng)進(jìn)行增長(zhǎng)。設(shè)置自增列的語(yǔ)法格式如下所示。【案例5.6】添加自增列。在數(shù)據(jù)庫(kù)學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(kù)(db_study)中創(chuàng)建一個(gè)數(shù)據(jù)表,名稱為tb_student,用于保存學(xué)生信息,其中需要將學(xué)號(hào)student_id字段實(shí)現(xiàn)自增長(zhǎng),且初始值為20220101001,學(xué)生表的表結(jié)構(gòu)如下表所示。5.2.7使用AUTO_INCREMENT自增列【案例5.6】添加自增列。在數(shù)據(jù)庫(kù)學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(kù)(db_study)中創(chuàng)建一個(gè)數(shù)據(jù)表,名稱為tb_student,用于保存學(xué)生信息,其中需要將學(xué)號(hào)student_id字段實(shí)現(xiàn)自增長(zhǎng),且初始值為20220101001,學(xué)生表的表結(jié)構(gòu)如下表所示。5.2.7使用AUTO_INCREMENT自增列在學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(kù)中創(chuàng)建tb_student數(shù)據(jù)表,按照要求添加自增長(zhǎng)的SQL語(yǔ)句如下所示。5.2.7使用AUTO_INCREMENT自增列執(zhí)行上述SQL語(yǔ)句,運(yùn)行結(jié)果如下圖所示。5.2.7使用AUTO_INCREMENT自增列由運(yùn)行結(jié)果可以得知:成功創(chuàng)建完tb_student數(shù)據(jù)表后,可以執(zhí)行“DESC表名稱;”語(yǔ)句(具體請(qǐng)見(jiàn)5.3.2查看數(shù)據(jù)表結(jié)構(gòu))查看數(shù)據(jù)表的結(jié)構(gòu),發(fā)現(xiàn)在tb_student表中已將student_id字段添加了自增列約束。

說(shuō)明:(1)在默認(rèn)情況下,自增列的初始值為1,每新增一條記錄,字段值自動(dòng)加1;(2)一個(gè)表中只能有一個(gè)字段使用自增列約束,且該字段必須為主鍵或主鍵的一部分;(3)自增列約束只能是整數(shù)類(lèi)型,例如TINYINT、SMALLINT、INT、BIGINT等。5.2.8使用默認(rèn)值約束默認(rèn)約束(DefaultConstraint)是給某個(gè)字段/某列指定默認(rèn)值,一旦設(shè)置默認(rèn)值,在插入數(shù)據(jù)時(shí),如果此字段沒(méi)有顯式賦值,則賦值為默認(rèn)值。例如在1班中的學(xué)生,那么班級(jí)編號(hào)就可以指定默認(rèn)值“01”。如果插入一條新的記錄并且沒(méi)有為這個(gè)字段賦值,則系統(tǒng)會(huì)自動(dòng)為班級(jí)編號(hào)這個(gè)字段賦值為“01”。默認(rèn)值約束的語(yǔ)法格式如下所示。

說(shuō)明:(1)DEFAULT:表示默認(rèn)值約束的關(guān)鍵字;(2)默認(rèn)值:表示一個(gè)具體的值也可以是通過(guò)表達(dá)式得到的一個(gè)值,但必須與該字段的數(shù)據(jù)類(lèi)型相匹配;(3)一個(gè)表可以有很多的默認(rèn)值約束,在創(chuàng)建表時(shí)為列添加默認(rèn)值,可以一次為多個(gè)列添加默認(rèn)值,需要注意不同列的數(shù)據(jù)類(lèi)型;(4)默認(rèn)值約束意味著,該字段如果沒(méi)有手動(dòng)賦值,會(huì)按默認(rèn)值處理。5.2.9使用檢查約束檢查約束(CheckConstraint)是指在進(jìn)行數(shù)據(jù)更新前設(shè)置一些過(guò)濾條件,滿足此條件的數(shù)據(jù)可以實(shí)現(xiàn)更新,可以使用“CHECK”關(guān)鍵字可以定義檢查約束。用于檢驗(yàn)輸入值,拒絕接受不滿足條件的值,減少無(wú)效數(shù)據(jù)的輸入。檢查約束的語(yǔ)法格式如下所示。

說(shuō)明:CHECK:表示設(shè)置檢查約束的關(guān)鍵字。雖然有檢查約束這種概念,但是在實(shí)際場(chǎng)景中,會(huì)比較少使用檢查約束,為什么?因?yàn)樗械臋z查約束都是逐個(gè)進(jìn)行過(guò)濾,如果在一個(gè)數(shù)據(jù)表上進(jìn)行了過(guò)多的檢查約束,在進(jìn)行數(shù)據(jù)更新的時(shí)候會(huì)嚴(yán)重影響程序的性能。比如說(shuō):哪里有交警哪里就絕對(duì)堵車(chē),一條路沒(méi)有任何障礙物,就能很快通過(guò),但是一旦有個(gè)障礙物,就會(huì)變得很慢。5.2.10查看數(shù)據(jù)表結(jié)構(gòu)在MySQL中使用SQL語(yǔ)句創(chuàng)建好數(shù)據(jù)表之后,可以查看數(shù)據(jù)表的結(jié)構(gòu),確認(rèn)數(shù)據(jù)表的定義是否正確。MySQL支持使用“DESCRIBE/DESC”語(yǔ)句查看數(shù)據(jù)表結(jié)構(gòu),也支持使用“SHOWCREATETABLE”語(yǔ)句查看數(shù)據(jù)表結(jié)構(gòu)。以下是分別介紹這兩種查看數(shù)據(jù)表結(jié)構(gòu)的方法。1.DESCRIBE/DESC語(yǔ)句使用“DESCRIBE/DESC”語(yǔ)句可以查看數(shù)據(jù)表的基本結(jié)構(gòu),語(yǔ)法格式如下所示。

說(shuō)明:表名稱:表示需要查看數(shù)據(jù)表結(jié)構(gòu)的表的名稱。5.2.10查看數(shù)據(jù)表結(jié)構(gòu)【案例5.7】查看數(shù)據(jù)表的基本結(jié)構(gòu)。使用DESCRIBE/DESC語(yǔ)句查看班級(jí)表tb_class的基本結(jié)構(gòu),SQL語(yǔ)句如下。執(zhí)行上述SQL語(yǔ)句,運(yùn)行結(jié)果如下圖所示。5.2.10查看數(shù)據(jù)表結(jié)構(gòu)由運(yùn)行結(jié)果得知:使用“DESCRIBE表名稱;”和“DESC表名稱;”語(yǔ)句查詢的結(jié)果一樣,可以查看表的字段名稱、字段數(shù)據(jù)類(lèi)型、是否為主鍵、是否唯一等。其中,各個(gè)字段的含義分別解釋如下。Field:表示字段名稱;Type:表示字段類(lèi)型,這里CHAR、VARCHAR是文本字符串類(lèi)型;Null:表示該列是否可以存儲(chǔ)NULL值;Key:表示該列是否已編制索引。PRI表示該列是表主鍵的一部分;UNI表示該列是UNIQUE索引的一部分;MUL表示在列中某個(gè)給定值允許出現(xiàn)多次;Default:表示該列是否有默認(rèn)值,如果有,那么值是多少;Extra:表示可以獲取的與給定列有關(guān)的附加信息,例如AUTO_INCREMENT等。5.2.10查看數(shù)據(jù)表結(jié)構(gòu)2.SHOWCREATETABLE語(yǔ)句使用“SHOWCREATETABLE”語(yǔ)句不僅可以查看表創(chuàng)建時(shí)的詳細(xì)語(yǔ)句,還可以查看存儲(chǔ)引擎和字符編碼。語(yǔ)法格式如下所示。【案例5.8】查看數(shù)據(jù)表的詳細(xì)信息。使用“SHOWCREATETABLE”語(yǔ)句查看班級(jí)表tb_class的詳細(xì)信息,SQL語(yǔ)句如下。5.2.10查看數(shù)據(jù)表結(jié)構(gòu)執(zhí)行上述SQL語(yǔ)句,運(yùn)行結(jié)果如下兩圖所示。由運(yùn)行結(jié)果可知:(1)執(zhí)行“SHOWCREATETABLE表名稱;”和“SHOWCREATETABLE表名稱\G”語(yǔ)句查看數(shù)據(jù)表的詳細(xì)信息的結(jié)果是一樣的;(2)\G參數(shù)相當(dāng)于格式化輸出,使用\G之后,可以看到輸出內(nèi)容具有較高的易讀性。修改數(shù)據(jù)表035.3.1重命名表在實(shí)際開(kāi)發(fā)當(dāng)中,還需要根據(jù)實(shí)際情況來(lái)對(duì)數(shù)據(jù)表進(jìn)行修改,當(dāng)需要修改數(shù)據(jù)表的名稱,則可以執(zhí)行“ALTERTABLE”語(yǔ)句來(lái)實(shí)現(xiàn)表名稱的修改,具體語(yǔ)法格式如下。其中TO表示為可選參數(shù),使用與否不影響執(zhí)行結(jié)果?!景咐?.9】修改數(shù)據(jù)表的名稱。在已有的數(shù)據(jù)表tb_class中,將tb_class表改為“班級(jí)表”,使用“ALTERTABLE”語(yǔ)句修改新的表名稱,SQL語(yǔ)句如下。5.3.1重命名表執(zhí)行上述SQL語(yǔ)句,再執(zhí)行“SHOWTABLES;”語(yǔ)句查看數(shù)據(jù)表,發(fā)現(xiàn)tb_class表已成功修改為“班級(jí)表”運(yùn)行結(jié)果如下圖所示。5.3.2添加字段在實(shí)際工作當(dāng)中,隨著業(yè)務(wù)需求的變化,可能需要在表中添加新的字段,添加字段時(shí)可以修改字段的排列位置,在MySQL中添加新的字段的語(yǔ)法格式如下。

說(shuō)明:(1)FIRST是可選參數(shù),其作用是將新添加的字段設(shè)置為表的第一個(gè)字段;(2)AFTER是可選參數(shù),其作用是將新添加的字段添加到指定的“已存在字段名”的后面。【案例5.10】添加新的字段。對(duì)【案例5.9】中的班級(jí)表進(jìn)行完善。為了統(tǒng)計(jì)每個(gè)班的總?cè)藬?shù),現(xiàn)在需要在班級(jí)表中添加新的字段,并命名為class_size,數(shù)據(jù)類(lèi)型為T(mén)INYINT類(lèi)型,SQL語(yǔ)句如下。5.3.2添加字段執(zhí)行上述SQL語(yǔ)句,再執(zhí)行“DESC表名稱;”語(yǔ)句查看數(shù)據(jù)表結(jié)構(gòu),發(fā)現(xiàn)class_size字段已添加在列表中,運(yùn)行結(jié)果如下圖所示。5.3.2添加字段在MySQL中,當(dāng)創(chuàng)建好數(shù)據(jù)表時(shí),想要修改數(shù)據(jù)類(lèi)型時(shí),可以使用“ALTERTABLE”語(yǔ)句修改字段的數(shù)據(jù)類(lèi)型,修改字段的數(shù)據(jù)類(lèi)型一般語(yǔ)法格式如下。

說(shuō)明:(1)表名稱:表示需要修改數(shù)據(jù)表的名稱;(2)字段名:表示需要添加數(shù)據(jù)類(lèi)型的字段列;(3)字段類(lèi)型:表示該字段需要修改的數(shù)據(jù)類(lèi)型。當(dāng)在創(chuàng)建數(shù)據(jù)表時(shí)沒(méi)有添加約束,也可以執(zhí)行“ALTERTABLE”語(yǔ)句進(jìn)行添加或修改,不同的約束有不同的修改方式,以下分別講解在修改數(shù)據(jù)表時(shí)添加約束的語(yǔ)法格式。5.3.2添加字段1.修改數(shù)據(jù)表字段時(shí)添加主鍵約束當(dāng)創(chuàng)建完數(shù)據(jù)表后,如果還需要為數(shù)據(jù)表的某個(gè)字段添加主鍵約束時(shí),可以不需要重新創(chuàng)建數(shù)據(jù)表,可以使用“ALTER”語(yǔ)句為現(xiàn)有的數(shù)據(jù)表添加主鍵,語(yǔ)法格式如下。

說(shuō)明:(1)約束名:表示需要添加外鍵約束的名稱;(2)字段:表示需要添加外鍵約束的字段列,可以由多個(gè)列組成;(3)CONSTRAINT:需要?jiǎng)?chuàng)建約束的關(guān)鍵字;(4)PRIMARYKEY:表示所添加約束的類(lèi)型為主鍵約束。5.3.2添加字段2.修改數(shù)據(jù)表字段時(shí)添加外鍵約束如果在創(chuàng)建數(shù)據(jù)表時(shí)沒(méi)有創(chuàng)建外鍵,可以使用“ALTER”語(yǔ)句為現(xiàn)有的數(shù)據(jù)表添加外鍵,語(yǔ)法格式如下。

說(shuō)明:(1)約束名:需要添加的外鍵約束名稱;(2)CONSTRAINT:需要添加約束的關(guān)鍵字;(3)FOREIGNKEY:表示所添加約束的類(lèi)型為外鍵鍵約束;(4)主鍵列:表示需要被應(yīng)用的表中的列名,也可以由多個(gè)列組成。5.3.2添加字段3.修改數(shù)據(jù)表字段時(shí)添加唯一約束如果在創(chuàng)建數(shù)據(jù)表時(shí)沒(méi)有創(chuàng)建唯一約束,可以使用“ALTER”語(yǔ)句為現(xiàn)有的數(shù)據(jù)表添加唯一約束,但是需要保證添加唯一性約束的列中存放的值沒(méi)有重復(fù)的。其語(yǔ)法格式如下。

說(shuō)明:(1)約束名:表示需要添加的唯一約束名稱;(2)字段名:需要設(shè)置唯一約束的字段名稱;(3)UNIQUE:表示唯一約束的關(guān)鍵字。5.3.2添加字段4.修改數(shù)據(jù)表字段時(shí)添加自增性約束如果在創(chuàng)建數(shù)據(jù)表時(shí)沒(méi)有創(chuàng)建自增列,可以使用“ALTER”語(yǔ)句為現(xiàn)有的數(shù)據(jù)表添加自增列約束,其語(yǔ)法格式如下。

說(shuō)明:(1)CHANGE:表示修改列屬性的關(guān)鍵字;(2)UNSIGNED:表示需要自增長(zhǎng)的數(shù)值無(wú)符號(hào)化;(3)AUTO_INCREMENT:表示自增列約束的關(guān)鍵字。5.3.2添加字段5.修改數(shù)據(jù)表字段時(shí)添加默認(rèn)值約束如果在創(chuàng)建數(shù)據(jù)表時(shí)沒(méi)有創(chuàng)建默認(rèn)值約束,可以使用“ALTER”語(yǔ)句為現(xiàn)有的數(shù)據(jù)表添加默認(rèn)值約束,其語(yǔ)法格式如下。

說(shuō)明:(1)約束名:表示添加默認(rèn)值的約束名;(2)默認(rèn)值:表示具體的一個(gè)值或通過(guò)表達(dá)式得到的一個(gè)值,但該值必須與該字段的數(shù)據(jù)類(lèi)型相匹配。5.3.2添加字段【案例5.11】修改字段的約束條件。在添加class_size字段時(shí),沒(méi)有添加唯一性約束,現(xiàn)在給班級(jí)表中的class_size字段添加一個(gè)唯一約束,SQL語(yǔ)句如下。執(zhí)行上述SQL語(yǔ)句,再執(zhí)行“DESC表名稱;”語(yǔ)句查看字段的約束是否修改成功,發(fā)現(xiàn)在班級(jí)表中class_size的字段約束已添加為唯一約束,運(yùn)行結(jié)果如下圖所示。5.3.3重命名字段重命名字段就是把舊的字段名修改一個(gè)新的字段名稱,為了方便開(kāi)發(fā)人員或數(shù)據(jù)庫(kù)維護(hù)人員管理數(shù)據(jù)表,其語(yǔ)法格式如下。

說(shuō)明:(1)舊字段名:指修改前的字段名稱;(2)新字段名:指修改后字段名稱;(3)新數(shù)據(jù)類(lèi)型:表示修改后的數(shù)據(jù)類(lèi)型,如果不需要修改字段的數(shù)據(jù)類(lèi)型,可以將新數(shù)據(jù)類(lèi)型設(shè)置與原來(lái)的一樣即可,但數(shù)據(jù)類(lèi)型不能為空。5.3.3重命名字段【案例5.12】修改字段名稱。將班級(jí)表中的class_size字段的名稱修改為“班級(jí)人數(shù)”,數(shù)據(jù)類(lèi)型不變,SQL語(yǔ)句如下。執(zhí)行上述SQL語(yǔ)句,再執(zhí)行“DESC表名稱;”語(yǔ)句查看字段的名稱是否修改成功,發(fā)現(xiàn)班級(jí)表中class_size的字段已成功修改成新的字段名稱“班級(jí)人數(shù)”,運(yùn)行結(jié)果如下圖所示。5.3.4修改字段的排列位置對(duì)于一個(gè)數(shù)據(jù)表來(lái)說(shuō),在創(chuàng)建的時(shí)候,字段就在表中的排列順序就已經(jīng)確定了,但表的結(jié)構(gòu)并不是完全不可以改變的,也可以執(zhí)行“ALTERTABLE”語(yǔ)句來(lái)改變表中字段的位置,其語(yǔ)法格式如下。

說(shuō)明:(1)MODIFY:表示修改列屬性的關(guān)鍵字;(2)字段1:表示需要修改位置的字段;(3)數(shù)據(jù)類(lèi)型:指的是字段1的數(shù)據(jù)類(lèi)型;(4)字段2:表示需要插入新字段的前一個(gè)字段;(5)FIRST:其作用是將字段1修改為數(shù)據(jù)表中的第一個(gè)字段;(6)AFTER:其作用是將字段1插到字段2的后面。5.3.4修改字段的排列位置【案例5.13】修改字段的排列位置。將班級(jí)表中的班級(jí)人數(shù)字段的位置排列到class_name字段的后面,SQL語(yǔ)句如下。執(zhí)行上述SQL語(yǔ)句,再執(zhí)行“DESC表名稱;”語(yǔ)句查看班級(jí)人數(shù)字段是否排列在class_name字段的后面,發(fā)現(xiàn)在班級(jí)表中班級(jí)人數(shù)字段已排列在class_name字段的后面,運(yùn)行結(jié)果如下圖所示。5.3.5刪除字段在MySQL中,刪除字段就是將數(shù)據(jù)表中的某個(gè)字段從表中移除,其語(yǔ)法格式如下?!景咐?.14】刪除字段。在班級(jí)表中,將剛修改的“班級(jí)人數(shù)”字段刪除掉,SQL語(yǔ)句如下。執(zhí)行上述SQL語(yǔ)句,再執(zhí)行“DESC表名稱;”語(yǔ)句查看班級(jí)人數(shù)字段是否刪除成功,發(fā)現(xiàn)班級(jí)表中的班級(jí)人數(shù)字段已刪除成功,運(yùn)行結(jié)果如下圖所示。刪除數(shù)據(jù)表045.4.1刪除沒(méi)有被關(guān)聯(lián)的表刪除沒(méi)有被關(guān)聯(lián)的表就是刪除與其他數(shù)據(jù)表沒(méi)有關(guān)聯(lián)的表,使用“DROPTABLE”語(yǔ)句刪除,可以一次刪除一個(gè)或多個(gè)沒(méi)有被其他表關(guān)聯(lián)的數(shù)據(jù)表,語(yǔ)法格式如下?!景咐?.15】刪除課程表。在數(shù)據(jù)庫(kù)學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(kù)中,先創(chuàng)建一個(gè)沒(méi)有關(guān)聯(lián)其他數(shù)據(jù)表的表,稱為課程表(tb_course),用于保存課程信息,其中課程號(hào)設(shè)置為主鍵,課程名稱不可以重復(fù),表結(jié)構(gòu)如下表所示。

說(shuō)明:(1)數(shù)據(jù)表n:表示需要?jiǎng)h除的數(shù)據(jù)表的名稱,可以同時(shí)刪除多個(gè)數(shù)據(jù)表,相互之間用逗號(hào)隔開(kāi)即可;(2)IFEXISTS:用于在刪除前判斷表是否存在。5.4.1刪除沒(méi)有被關(guān)聯(lián)的表【案例5.15】刪除課程表。在數(shù)據(jù)庫(kù)學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(kù)中,先創(chuàng)建一個(gè)沒(méi)有關(guān)聯(lián)其他數(shù)據(jù)表的表,稱為課程表(tb_course),用于保存課程信息,其中課程號(hào)設(shè)置為主鍵,課程名稱不可以重復(fù),表結(jié)構(gòu)如下表所示。5.4.1刪除沒(méi)有被關(guān)聯(lián)的表在學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(kù)中創(chuàng)建tb_course數(shù)據(jù)表,SQL語(yǔ)句如下所示。5.4.1刪除沒(méi)有被關(guān)聯(lián)的表執(zhí)行上述SQL語(yǔ)句,再執(zhí)行“SHOWTABLES;”語(yǔ)句查看課程表是否創(chuàng)建成功,運(yùn)行結(jié)果如下圖所示。由運(yùn)行結(jié)果可知,發(fā)現(xiàn)列表中有tb_course表,說(shuō)明課程表已創(chuàng)建成功。在學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(kù)中課程表tb_course與其他數(shù)據(jù)沒(méi)有任何關(guān)聯(lián),當(dāng)想要?jiǎng)h除課程表時(shí),可以直接使用以下SQL語(yǔ)句。執(zhí)行上述SQL語(yǔ)句,再執(zhí)行“SHOWTABLES;”語(yǔ)句查看課程表是否刪除成功,發(fā)現(xiàn)數(shù)據(jù)庫(kù)學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(kù)中已經(jīng)沒(méi)有課程表了,說(shuō)明已刪除成功,運(yùn)行結(jié)果如下圖所示。5.4.1刪除沒(méi)有被關(guān)聯(lián)的表5.4.2刪除被其他關(guān)聯(lián)的主表在數(shù)據(jù)表之間存在外鍵關(guān)聯(lián)的情況下,如果直接刪除父表,結(jié)果會(huì)顯示失敗,原因是之間刪除將破壞表的完整性。如果必須要?jiǎng)h除,可以先直接刪除與它關(guān)聯(lián)的子表,再刪除父表,只是這樣就同時(shí)刪除了兩個(gè)數(shù)據(jù)表中的數(shù)據(jù),或者將關(guān)聯(lián)表的外鍵約束取消,再刪除父表;適用于需要保留子表的數(shù)據(jù),只刪除父表的情況。在MySQL中刪除外鍵的語(yǔ)法格式如下。【案例5.16】刪除部門(mén)表。在數(shù)據(jù)庫(kù)學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(kù)中,將部門(mén)表tb_department進(jìn)行刪除,但在案例5.4中已經(jīng)將department_id字段設(shè)置為外鍵,如果直接刪除部門(mén)表,會(huì)顯示失敗。SQL語(yǔ)句如下。5.4.2刪除被其他關(guān)聯(lián)的主表執(zhí)行上述SQL語(yǔ)句,可以看到直接刪除主表tb_department時(shí),MySQL會(huì)出現(xiàn)“3730”報(bào)錯(cuò)。運(yùn)行結(jié)果如下圖所示。由錯(cuò)誤提示信息可知,department_id是班級(jí)表的外鍵約束字段,班級(jí)表為子表,具有名稱為fk_department_id1的外鍵約束,tb_department為父表,其主鍵department_id被子表班級(jí)表所關(guān)聯(lián)。則需要解除關(guān)聯(lián)子表班級(jí)表的外鍵約束,SQL語(yǔ)句如下。運(yùn)行上述SQL語(yǔ)句,運(yùn)行結(jié)果如下圖所示。5.4.2刪除被其他關(guān)聯(lián)的主表由運(yùn)行結(jié)果可知,當(dāng)出現(xiàn)“QueryOK”提示信息,說(shuō)明已經(jīng)將關(guān)聯(lián)子表的外鍵約束刪除成功,則可以將父表tb_department刪除掉,SQL語(yǔ)句如下。運(yùn)行上述SQL語(yǔ)句,最后再執(zhí)行“SHOWTABLES;”語(yǔ)句查看列表中是否還有數(shù)據(jù)表tb_department,發(fā)現(xiàn)數(shù)據(jù)庫(kù)學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(kù)中已經(jīng)沒(méi)有tb_department表了,說(shuō)明已刪除成功,運(yùn)行結(jié)果如下圖所示。課業(yè)任務(wù)055.5

課業(yè)任務(wù)王小明想利用MySQL+Java開(kāi)發(fā)一個(gè)數(shù)據(jù)庫(kù)學(xué)習(xí)系統(tǒng),在熟悉了MySQL數(shù)據(jù)庫(kù)的管理后,需熟悉對(duì)數(shù)據(jù)表的管理,并熟練掌握數(shù)據(jù)表的將為后續(xù)開(kāi)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論