版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
MySQL數(shù)據(jù)表結(jié)構(gòu)管理第5章通過本課程的學(xué)習(xí),您將應(yīng)該:了解數(shù)據(jù)庫的相關(guān)概念熟悉數(shù)據(jù)庫工具的使用熟悉SQL語言的規(guī)則與規(guī)范熟練掌握MySQL數(shù)據(jù)庫管理方法熟練掌握MySQL表結(jié)構(gòu)管理方法熟練掌握表記錄的檢索方法熟練掌握視圖與索引的使用方法熟練掌握數(shù)據(jù)處理之增刪改熟練掌握存儲(chǔ)過程與游標(biāo)的使用方法熟練掌握存儲(chǔ)函數(shù)的應(yīng)用熟練掌握觸發(fā)器的應(yīng)用熟練掌握事務(wù)的基本特性和應(yīng)用場景熟練掌握數(shù)據(jù)庫安全及管理熟練掌握MySQL數(shù)據(jù)庫備份和恢復(fù)操作了解利用MySQL+Java開發(fā)一個(gè)數(shù)據(jù)庫學(xué)習(xí)系統(tǒng)并部署課程目標(biāo)項(xiàng)目部署成功本講教學(xué)目標(biāo)熟悉常見的MySQL數(shù)據(jù)類型、約束類型。掌握如何創(chuàng)建數(shù)據(jù)表掌握查看數(shù)據(jù)表的結(jié)構(gòu)掌握修改數(shù)據(jù)表通過完成課業(yè)任務(wù)學(xué)會(huì)分析問題、解決問題,提高動(dòng)手操作能力。通過本講的學(xué)習(xí),您將可以:1.OPTION2.OPTIONOPTION4.OPTION3.5.OPTIONtb_course表的數(shù)據(jù)添加目錄Content數(shù)據(jù)類型01創(chuàng)建數(shù)據(jù)表02修改數(shù)據(jù)表03刪除數(shù)據(jù)表04課業(yè)任務(wù)05常見錯(cuò)誤及解決方案06數(shù)據(jù)類型015.1.1MySQL數(shù)據(jù)類型介紹數(shù)據(jù)類型是指在系統(tǒng)中用于限制或允許該列中存儲(chǔ)的數(shù)據(jù)。在MySQL中,數(shù)據(jù)類型主要根據(jù)數(shù)據(jù)值的內(nèi)容、大小、精度來選擇,給字段選擇合適的數(shù)據(jù)類型對(duì)數(shù)據(jù)庫的優(yōu)化具有很重要的作用;反之,則可能會(huì)嚴(yán)重影響應(yīng)用程序的功能和性能。MySQL支持多種數(shù)據(jù)類型,主要分為三種數(shù)據(jù)類型:數(shù)值、日期與時(shí)間以及字符串類型,其中數(shù)值類型又包括整數(shù)類型、浮點(diǎn)數(shù)與定點(diǎn)數(shù)類型;字符串類型包括文本字符串、二進(jìn)制字符串類型。MySQL具體包括的數(shù)據(jù)庫類型如下表所示。5.1.2整數(shù)類型MySQL中的整數(shù)類型分為TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和BIGINT這5個(gè)類型。不同的數(shù)據(jù)類型存儲(chǔ)空間不同,提供的取值范圍也不同。因?yàn)榇鎯?chǔ)范圍越大,存儲(chǔ)的空間也越大,所以在實(shí)際中需要根據(jù)需求選擇合適的數(shù)據(jù)類型,這樣有利于節(jié)約存儲(chǔ)空間以及利于提高查詢效率。MySQL中整數(shù)類型的具體區(qū)別如下表所示。5.1.2整數(shù)類型
說明:在MySQL5.7版本中,整型數(shù)據(jù)類型可以在定義表結(jié)構(gòu)時(shí)指定所需要的顯示寬度,如果不指定,則系統(tǒng)為每一種類型指定默認(rèn)的寬度值。從MySQL8.0.17開始,整數(shù)數(shù)據(jù)類型不推薦使用顯示寬度屬性。面對(duì)實(shí)際場景需求時(shí),該如何進(jìn)行選擇?以下是MySQL整數(shù)類型的不同場景選擇。(1)TINYINT:一般可用于枚舉數(shù)據(jù),例如系統(tǒng)設(shè)定取值范圍很小且固定的場景;(2)SMALLINT:一般可以用于較小范圍的統(tǒng)計(jì)數(shù)據(jù),例如統(tǒng)計(jì)工廠的固定資產(chǎn)庫存數(shù)量等;(3)MEDIUMINT:一般可用于較大整數(shù)的計(jì)算,例如車站每日的客流量等;(4)INT(INTEGER):一般用于取值范圍足夠大,一般情況下不用考慮超限問題,用得最多,例如商品編號(hào);(5)BIGINT:一般只有當(dāng)處理特別巨大的整數(shù)時(shí)才會(huì)用到,例如雙十一的交易量、大型門戶網(wǎng)站點(diǎn)擊量、證券公司衍生產(chǎn)品持倉等。5.1.3浮點(diǎn)數(shù)與定點(diǎn)數(shù)類型在實(shí)際開發(fā)當(dāng)中,會(huì)有很多情況需要存儲(chǔ)的數(shù)據(jù)是有小數(shù)數(shù)值的,這就想要使用到浮點(diǎn)數(shù)類型。在MySQL中的浮點(diǎn)數(shù)類型主要有兩種,分別單精度浮點(diǎn)數(shù)FLOAT和雙精度浮點(diǎn)數(shù)DOUBLE。1.浮點(diǎn)數(shù)類型浮點(diǎn)數(shù)類型可以用(M,D)來表示,其中M稱為精度,表示整數(shù)的位數(shù);D稱為標(biāo)度,小數(shù)的位數(shù)。MySQL中浮點(diǎn)數(shù)類型的存儲(chǔ)范圍和取值范圍如下表所示。5.1.3浮點(diǎn)數(shù)與定點(diǎn)數(shù)類型2.定點(diǎn)數(shù)類型當(dāng)對(duì)精確度要求較高的項(xiàng)目時(shí),則可以使用定點(diǎn)數(shù)類型。在MySQL中的定點(diǎn)數(shù)類型只有DECIMAL一種類型,定點(diǎn)數(shù)也可以用(M,D)來表示,其中M稱為精度,表示數(shù)據(jù)的總位數(shù);D稱為標(biāo)度,表示數(shù)據(jù)的小數(shù)部分的位數(shù)。MySQL中定點(diǎn)數(shù)類型的取值范圍如下表所示。
說明:(1)FLOAT和DOUBLE浮點(diǎn)數(shù)類型之間的區(qū)別如下:FLOAT占用字節(jié)數(shù)少,取值范圍小。DOUBLE占用字節(jié)數(shù)多,取值范圍也大;(2)當(dāng)浮點(diǎn)數(shù)類型不指定數(shù)據(jù)精度時(shí),系統(tǒng)會(huì)默認(rèn)按照實(shí)際計(jì)算機(jī)硬件和操作系統(tǒng)來決定精度;若指定精度超出浮點(diǎn)數(shù)類型的數(shù)據(jù)精度,系統(tǒng)則會(huì)自動(dòng)四舍五入,且正常顯示。5.1.3浮點(diǎn)數(shù)與定點(diǎn)數(shù)類型
說明:(1)定點(diǎn)數(shù)類型是以字符串存儲(chǔ)的;(2)當(dāng)定點(diǎn)數(shù)類型不指定M和D時(shí),系統(tǒng)則默認(rèn)為“DECIMAL(10,0)”;(3)若數(shù)據(jù)的精度超出了定點(diǎn)數(shù)類型的精度范圍,MySQL系統(tǒng)也會(huì)進(jìn)行四舍五入操作,但會(huì)有警告。浮點(diǎn)數(shù)和定點(diǎn)數(shù)類型在實(shí)際場景當(dāng)中,該如何進(jìn)行選擇?以下是MySQL浮點(diǎn)數(shù)和定點(diǎn)數(shù)類型的不同場景選擇。定點(diǎn)數(shù)類型適合于對(duì)精度要求極高的場景,例如涉及金額計(jì)算的場景。浮點(diǎn)數(shù)類型適用于需要取值范圍大,且可容忍微小誤差的科學(xué)計(jì)算場景,例如計(jì)算化學(xué)、分子建模、流體動(dòng)力學(xué)等;5.1.4日期與時(shí)間類型MySQL有多種數(shù)據(jù)類型用于表示日期和時(shí)間,主要有:YEAR、TIME、DATE、DATETIME和TIMESTAMP類型。MySQL的日期和時(shí)間類型的日期格式、取值范圍如上表所示。5.1.4日期與時(shí)間類型日期與時(shí)間類型的主要區(qū)別如下:1.YEAR類型MySQL中YEAR類型有兩種存儲(chǔ)格式,分別是以4位字符串或數(shù)字格式表示和以2位字符串格式表示。
說明:(1)當(dāng)以4位字符串或數(shù)字格式表示時(shí),格式為:“YYYY”,數(shù)值取值范圍為“1901~2155”。(2)當(dāng)以2位字符串格式表示YEAR類型時(shí),表示范圍如下表所示。5.1.4日期與時(shí)間類型2.DATE類型DATE類型用于僅需要日期值時(shí),沒有時(shí)間部分,日期格式為“YYYY-MM-DD”,其中YYYY表示年,MM表示月,DD表示日。
說明:(1)若以YYYYMMDD格式表示,則會(huì)被轉(zhuǎn)化為YYYY-MM-DD格式;(2)使用CURRENT_DATE()或者NOW()函數(shù),會(huì)獲取當(dāng)前系統(tǒng)的日期。3.TIME類型TIME類型用于只需要時(shí)間信息的值,格式為HH:MM:SS。HH表示小時(shí),MM表示分鐘,SS表示秒。5.1.4日期與時(shí)間類型
說明:(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í)間類型的數(shù)據(jù)是用“HH:MM:SS”格式進(jìn)行存儲(chǔ)和比較的,如果插入的數(shù)據(jù)不符合這個(gè)格式,MySQL會(huì)將其自動(dòng)轉(zhuǎn)換為“HH:MM:SS”格式,如果無法轉(zhuǎn)換則會(huì)被視為“00:00:00”;(3)使用CURRENT_TIME()或者NOW()函數(shù),會(huì)插入當(dāng)前系統(tǒng)的日期。5.1.4日期與時(shí)間類型4.DATETIME類型DATETIME類型在格式上是DATE類型和TIME類型的結(jié)合,是在所有類型中存儲(chǔ)內(nèi)存最大的,格式為“YYYY-MM-DDHH:MM:SS”或“YYYYMMDDHHMMSS”,其中,YYYY表示年份,MM表示月份,DD表示日期,HH表示小時(shí),MM表示分鐘,SS表示秒。
說明:(1)插入DATETIME類型的字段時(shí),兩位數(shù)的年份規(guī)則符合YEAR類型的規(guī)則;(2)存儲(chǔ)格式類同于DATE類型的存儲(chǔ)格式,以YYYYMMDDHHMMSS格式的數(shù)字插入DATETIME類型的字段時(shí),會(huì)被轉(zhuǎn)化為YYYY-MM-DDHH:MM:SS格式;(3)使用CURRENT_TIMESTAMP()或者NOW()函數(shù),可以向DATETIME類型的字段插入當(dāng)前系統(tǒng)的日期和時(shí)間。5.1.4日期與時(shí)間類型5.TIMESTAMP類型TIMESTAMP類型的格式與DATATIME類型的格式相同,也可以表示日期和時(shí)間。但與DATATIME類型不同的是,TIMESTAMP類型在存儲(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í)間。
說明:(1)當(dāng)插入TIMESTAMP類型的字段時(shí),兩位數(shù)值的年份同樣符合YEAR類型的規(guī)則條件;(2)TIMESTAMP類型表示的時(shí)間范圍要小很多,在插入字段時(shí),不要超出范圍,否則MySQL會(huì)拋出錯(cuò)誤;(3)使用CURRENT_TIMESTAMP()或者NOW()函數(shù),可以向TIMESTAMP類型的字段插入當(dāng)前系統(tǒng)的日期和時(shí)間。5.1.4日期與時(shí)間類型日期與時(shí)間的數(shù)據(jù)類型在實(shí)際場景,該如何選擇?以下是MySQL中日期與時(shí)間類型在實(shí)際場景中的選擇。(4)DATATIME占8個(gè)字節(jié),TIMESTAMP占4個(gè)字節(jié),若要求存儲(chǔ)范圍較大時(shí),建議使用DATATIME類型。DATETIME類型反映的是插入時(shí)當(dāng)?shù)氐臅r(shí)區(qū),不會(huì)因?yàn)樵L問用戶時(shí)區(qū)不同顯示的結(jié)果發(fā)生變化,而TIMESTAMP類型反映的是訪問用戶的時(shí)區(qū),不同時(shí)區(qū)的用戶訪問會(huì)顯示不同的結(jié)果。DATATIME和TIMESTAMP比較大小或日期計(jì)算時(shí),TIMESTAMP類型會(huì)更快、更方便。(1)若存儲(chǔ)數(shù)據(jù)需要記錄年份,則使用YEAR類型;(2)若存儲(chǔ)數(shù)據(jù)只需要記錄時(shí)間,則使用TIME類型;(3)若同時(shí)需要記錄日期和時(shí)間,則可以使用TIMESTAMP或者DATETIME類型;5.1.5文本字符串類型MySQL支持的字符串類型包括文本字符串類型和二進(jìn)制字符串類型,主要用來存儲(chǔ)字符串?dāng)?shù)據(jù),以及存儲(chǔ)圖片和聲音的二進(jìn)制數(shù)據(jù)。MySQL中的字符串類型主要分為CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET等類型。MySQL中的字符串?dāng)?shù)據(jù)類型主要包括的類型如下表所示,其中M表示為其指定長度。5.1.5文本字符串類型每一種文本字符串類型的長度范圍和占用存儲(chǔ)空間都是不同的,那么在實(shí)際應(yīng)用當(dāng)中要考慮好該字段適合的長度和存儲(chǔ)空間,再選擇合適的數(shù)據(jù)類型。1.CHAR與VARCHAR類型在MySQL中,CHAR(M)類型一般需要先定義字符串長度,若沒有指定M,則表示長度默認(rèn)是1個(gè)字符;而VARCHAR(M)類型是定義時(shí)必須指定長度M,否則會(huì)報(bào)錯(cuò)。
說明:(1)當(dāng)檢索到CHAR類型的數(shù)據(jù)時(shí),CHAR類型字段尾部的空格將被刪除;(2)但VARCHAR類型在保存和檢索字段數(shù)據(jù)時(shí),字段尾部的空格仍會(huì)保留。5.1.5文本字符串類型那么在實(shí)際場景,CHAR和VARCHAR類型該如何進(jìn)行選擇?以下是MySQL中CHAR和VARCHAR類型在實(shí)際場景中的選擇。(1)當(dāng)存儲(chǔ)的信息較短,速度要求高時(shí),可以使用CHAR類型來實(shí)現(xiàn),例如班級(jí)號(hào)(01,02...)。反之,則選擇VARCHAR類型來實(shí)現(xiàn);(2)當(dāng)需要固定長度時(shí),使用CHAR類型會(huì)更合適,而VARCHAR類型是動(dòng)態(tài)根據(jù)長度的特性就消失,而且還會(huì)占多一個(gè)長度信息。由于CHAR類型平均占用的空間多于VARCHAR類型,所以除了簡短并且固定長度的,其他考慮VARCHAR類型;(3)在InnoDB存儲(chǔ)引擎中,建議使用VARCHAR類型。因?yàn)閷?duì)于InnoDB數(shù)據(jù)表,內(nèi)部的行存儲(chǔ)格式并沒有區(qū)分固定長度和可變長度列,而且主要影響性能的因素是數(shù)據(jù)行使用的存儲(chǔ)總量,由于VARCHAR類型是按實(shí)際長度進(jìn)行存儲(chǔ)的,這樣節(jié)省空間,所以對(duì)磁盤I/O和數(shù)據(jù)存儲(chǔ)總量比較好。5.1.5文本字符串類型2.TEXT類型在MySQL中,TEXT類型分為4種,主要包括TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT類型,不同的TEXT類型保存的數(shù)據(jù)長度和所占用的存儲(chǔ)空間都不同。當(dāng)在TEXT類型字段上保存或查詢數(shù)據(jù)時(shí),與VARCHAR類型相同,不會(huì)刪除數(shù)據(jù)尾部的空格。如若在實(shí)際場景中,TEXT類型該如何進(jìn)行選擇?以下是MySQL中TEXT類型在實(shí)際場景中的選擇。(3)當(dāng)字符數(shù)大于5000時(shí),建議使用TEXT類型,并且新建一個(gè)表進(jìn)行存儲(chǔ),避免影響索引查詢的效率。
(1)當(dāng)TEXT列保存非二進(jìn)制字符串,如文章內(nèi)容、評(píng)論等;(2)在實(shí)際開發(fā)當(dāng)中,實(shí)際存儲(chǔ)長度不確定時(shí),不建議使用TEXT類型字段做主鍵;5.1.5文本字符串類型3.ENUM類型ENUM類型又叫作枚舉類型,它的取值范圍需要在創(chuàng)建表示通過枚舉方式進(jìn)行指定,在設(shè)置字段值時(shí),ENUM類型只允許從成員中選取單個(gè)值,不能一次選取多個(gè)值,其所需要的存儲(chǔ)空間是由定義ENUM類型時(shí)指定的成員個(gè)數(shù)決定。成員個(gè)數(shù)的具體范圍和存儲(chǔ)空間如上表所示,其中L表示實(shí)際成員個(gè)數(shù)。
說明:在定義字段時(shí),若ENUM類型字段聲明為NULL時(shí),插入NULL是有效值,默認(rèn)為NULL;若ENUM類型字段聲明為NOTNULL時(shí),插入NULL為無效值,默認(rèn)值為ENUM類型成員的第一個(gè)成員。4.SET類型SET與ENUM類型十分相似,SET類型也是一個(gè)字符串對(duì)象。與ENUM類型不同的是,SET類型一次可以選取多個(gè)成員,而ENUM類型則只能選取一個(gè)。當(dāng)一個(gè)字符串設(shè)置字段值時(shí),SET類型可以取成員個(gè)數(shù)范圍內(nèi)的0個(gè)或多個(gè)值。SET類型包含的成員個(gè)數(shù)和存儲(chǔ)空間都不同,具體如表表所示,其中L表示實(shí)際成員個(gè)數(shù)。5.1.5文本字符串類型5.1.6二進(jìn)制字符串類型在MySQL中,二進(jìn)制字符串類型主要存儲(chǔ)二進(jìn)制數(shù)據(jù),例如可以存儲(chǔ)圖片、音頻和視頻等二進(jìn)制數(shù)據(jù)。MySQL中支持的二進(jìn)制字符串類型主要包括BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB類型。其每種類型的長度以及存儲(chǔ)空間如上表所示,其中M和L都表示值的長度。1.BIT類型BIT類型又稱作位字段類型,主要存儲(chǔ)的是二進(jìn)制值,類似“010110”。若沒有指定M,默認(rèn)是1位。1位表示只能存1位的二進(jìn)制值。若分配的值的長度小于M位,則在值的左邊用“0”填充。MySQL中BIT類型的長度范圍和存儲(chǔ)空間如下表所示。5.1.6二進(jìn)制字符串類型2.BINARY與VARBINARY類型BINARY(M)是固定長度的二進(jìn)制字符串,如果未指定M,表示只能存儲(chǔ)1個(gè)字節(jié)。若字段值不足M個(gè)字節(jié),將在右邊填充“/0”以補(bǔ)齊指定長度;反之,超出的部分則會(huì)被截?cái)?。VARBINARY(M)是可變長度的二進(jìn)制字符串,必須指定M,否則會(huì)報(bào)錯(cuò)。MySQL中BINARY與VARBINARY類型的長度范圍和存儲(chǔ)空間如下表所示。5.1.6二進(jìn)制字符串類型3.BLOB類型在MySQL中BLOB類型包括4種類型,主要包括TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB類型。BLOB類型是一個(gè)二進(jìn)制的對(duì)象,主要用來存儲(chǔ)可變數(shù)量的數(shù)據(jù),例如圖片、音頻和視頻等。MySQL中BLOB類型的長度范圍和存儲(chǔ)空間如下表所示。5.1.6二進(jìn)制字符串類型在實(shí)際開發(fā)中,BLOB類型與TEXT類型該如何選擇?以下是MySQL中BLOB和TEXT類型在實(shí)際場景中的選擇。(2)BLOB類型的數(shù)據(jù)是以字節(jié)序列的形式存儲(chǔ)的,因此在進(jìn)行排序和比較時(shí),會(huì)基于這些字節(jié)的數(shù)值進(jìn)行操作。TEXT類型的數(shù)據(jù)則是以字符序列的形式存儲(chǔ)的,所以在排序和比較時(shí),會(huì)根據(jù)字符集規(guī)則對(duì)這些字符進(jìn)行操作;(3)在實(shí)際工作中,往往不會(huì)在MySQL數(shù)據(jù)庫中使用BLOB類型存儲(chǔ)大對(duì)象數(shù)據(jù),通常會(huì)將圖片、音頻和視頻文件存儲(chǔ)到服務(wù)器的磁盤上,并將圖片、音頻和視頻的訪問路徑存儲(chǔ)到MySQL中。(1)BLOB類型存儲(chǔ)的是二進(jìn)制字符串,而TEXT類型存儲(chǔ)的是非進(jìn)制字符串;創(chuàng)建數(shù)據(jù)表025.2.1約束概述在MySQL中,約束是指對(duì)表中數(shù)據(jù)的一種約束,能夠幫助數(shù)據(jù)庫管理員更好地管理數(shù)據(jù)庫,并且能夠確保數(shù)據(jù)庫中數(shù)據(jù)的完整性。數(shù)據(jù)完整性是指數(shù)據(jù)的精確性和可靠性,是防止數(shù)據(jù)庫中存在不符合語義規(guī)定的數(shù)據(jù)和防止因錯(cuò)誤信息的輸入輸出造成無效操作或錯(cuò)誤信息而提出的。例如,在數(shù)據(jù)表中存放身高的值時(shí),如果存入300、400cm這些無效的值就毫無意義了,所以使用約束來限定表中的數(shù)據(jù)范圍是很有必要的。約束可以在創(chuàng)建數(shù)據(jù)表時(shí)規(guī)定約束,執(zhí)行“CREATETABLE”語句,或者在數(shù)據(jù)表創(chuàng)建之后執(zhí)行“ALTERTABLE”語句規(guī)定約束。接下來講解創(chuàng)建數(shù)據(jù)表時(shí)該如何規(guī)定約束。5.2.2創(chuàng)建數(shù)據(jù)表的語法格式數(shù)據(jù)表是數(shù)據(jù)庫的重要組成部分,每一個(gè)數(shù)據(jù)庫都是由若干個(gè)數(shù)據(jù)表組成的。也就是說,沒有數(shù)據(jù)表就無法在數(shù)據(jù)庫中存放數(shù)據(jù)。所以在創(chuàng)建完數(shù)據(jù)庫之后,接下來就要在創(chuàng)建好的數(shù)據(jù)庫中創(chuàng)建新的數(shù)據(jù)表。創(chuàng)建數(shù)據(jù)表的過程是規(guī)定數(shù)據(jù)列的屬性的過程,同時(shí)也是實(shí)施數(shù)據(jù)完整性約束的過程。在MySQL中創(chuàng)建數(shù)據(jù)表的語法格式如下所示。5.2.2創(chuàng)建數(shù)據(jù)表的語法格式
說明:(1)表名稱:表示需要?jiǎng)?chuàng)建數(shù)據(jù)表的表的名稱;(2)字段:規(guī)定數(shù)據(jù)表中列的名稱;(3)數(shù)據(jù)類型:規(guī)定數(shù)據(jù)表中列的數(shù)據(jù)類型,例如VARCHAR、DATE等;(4)列級(jí)約束條件:指定列級(jí)字段的某些約束條件。在MySQL中創(chuàng)建數(shù)據(jù)表時(shí)需要注意的一些問題如下:創(chuàng)建數(shù)據(jù)表時(shí)加上了“IFNOTEXISTS”關(guān)鍵字,則表示:若當(dāng)前數(shù)據(jù)庫中不存在要?jiǎng)?chuàng)建的數(shù)據(jù)表,則創(chuàng)建數(shù)據(jù)表;如果當(dāng)前數(shù)據(jù)庫中已經(jīng)存在要?jiǎng)?chuàng)建的數(shù)據(jù)表,則忽略建表語句,不再創(chuàng)建數(shù)據(jù)表;在創(chuàng)建數(shù)據(jù)表時(shí),還需要指定數(shù)據(jù)表中每一列的名稱和數(shù)據(jù)類型,多個(gè)列之間需要以逗號(hào)進(jìn)行分隔;在Windows操作系統(tǒng)中,創(chuàng)建數(shù)據(jù)表的表名是不區(qū)分大小寫的,但不能使用SQL語言中的關(guān)鍵字,例如INSERT、ALTER、DROP等。5.2.2創(chuàng)建數(shù)據(jù)表的語法格式【案例5.1】創(chuàng)建數(shù)據(jù)表。在數(shù)據(jù)庫學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(db_study)中創(chuàng)建一個(gè)數(shù)據(jù)表,名稱為tb_department,用于保存部門信息,分別給每個(gè)字段選擇合適的數(shù)據(jù)類型,具體信息如下表所示。5.2.2創(chuàng)建數(shù)據(jù)表的語法格式在學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫中創(chuàng)建tb_department數(shù)據(jù)表前,需要使用“USE數(shù)據(jù)庫;”語句指定選擇使用的數(shù)據(jù)庫,再創(chuàng)建數(shù)據(jù)表,否則會(huì)報(bào)錯(cuò)。SQL語句如下所示。5.2.2創(chuàng)建數(shù)據(jù)表的語法格式執(zhí)行上述SQL語句,運(yùn)行結(jié)果如下圖所示創(chuàng)建部門表成功。也可以使用“SHOWTABLES”語句查看數(shù)據(jù)表是否創(chuàng)建成功,由結(jié)果得知,tb_department表已創(chuàng)建成功,執(zhí)行“SHOWTABLES”語句如下圖所示。5.2.3使用非空約束
說明:(1)在MySQL中默認(rèn)所有的類型的值都可以是NULL;(2)只能某個(gè)列單獨(dú)限定非空,不能組合非空;(3)空字符串’’不等于NULL,0也不等于NULL。非空約束(NotNullConstraint)指的就是數(shù)據(jù)表中某一列的內(nèi)容不允許為空,可以使用“NOTNULL”來表示,對(duì)于使用了非空約束的手段,如果用戶在添加數(shù)據(jù)時(shí)沒有指定的值,數(shù)據(jù)庫系統(tǒng)會(huì)報(bào)錯(cuò)。非空約束的語法格式如下所示。5.2.3使用非空約束【案例5.2】添加非空約束。對(duì)【案例5.1】中的部門表tb_department進(jìn)行完善,將字段department_id和字段department_name添加為非空,其他字段則默認(rèn)為空。當(dāng)想對(duì)表結(jié)構(gòu)進(jìn)行修改時(shí),則執(zhí)行“DROPTABLE”語句先將數(shù)據(jù)表刪除后再創(chuàng)建。SQL語句如下。5.2.3使用非空約束執(zhí)行上述SQL語句,運(yùn)行結(jié)果如下圖所示。5.2.3使用非空約束由運(yùn)行結(jié)果可以得知:當(dāng)出現(xiàn)“QueryOK”提示信息,則表示成功刪除或創(chuàng)建tb_department數(shù)據(jù)表。也可以執(zhí)行“DESC表名稱;”語句(具體請(qǐng)見5.3.2查看數(shù)據(jù)表結(jié)構(gòu))查看數(shù)據(jù)表的結(jié)構(gòu),發(fā)現(xiàn)department_id和department_name字段已添加了非空約束。
說明:在實(shí)際的工作之中,任何的開發(fā),當(dāng)表一旦設(shè)計(jì)了,基本就很難做修改。如果真的要進(jìn)行表結(jié)構(gòu)的修改,只有一個(gè)原則:刪除表后重建。但需要給某個(gè)字段添加約束時(shí)可以使用“ALTER”語句進(jìn)行添加(具體請(qǐng)見5.4.3修改字段)。5.2.4使用主鍵約束在MySQL中創(chuàng)建數(shù)據(jù)表時(shí),可以給數(shù)據(jù)表指定主鍵,主鍵又稱為主碼,是表中一列或多列的組合。主鍵約束(PrimaryKeyConstraint)是使用最頻繁的約束,主鍵約束既不能重復(fù)也不能為空,主鍵能夠唯一地標(biāo)識(shí)表中的一條記錄,可以結(jié)合外鍵來定義不同數(shù)據(jù)表之間的關(guān)系,并且加快數(shù)據(jù)庫查詢的速度,可以使用“PRIMARYKEY”表示,簡稱PK。在創(chuàng)建數(shù)據(jù)表時(shí)設(shè)置主鍵約束,可以由一個(gè)字段組成,也可以多個(gè)字段聯(lián)合組成。但是不管使用哪種方法,在一個(gè)表中只能設(shè)置一個(gè)主鍵。以下是單列主鍵和多列聯(lián)合主鍵的語法格式。1.單列主鍵單列主鍵是只包含數(shù)據(jù)表中的一個(gè)字段,MySQL中單列主鍵不僅可以在定義列時(shí)同時(shí)指定主鍵,還可以在定義完所有列之后指定主鍵。單列主鍵的語法格式如下所示。5.2.4使用主鍵約束【案例5.3】添加主鍵約束。對(duì)【案例5.2】中的部門表tb_department進(jìn)行完善,將字段department_id添加為主鍵,SQL語句如下。2.多列聯(lián)合主鍵多列主鍵是支持多個(gè)字段溝通組成的,但多列聯(lián)合主鍵只能在定義完所有列之后指定。多列聯(lián)合主鍵的語法格式如下所示。5.2.4使用主鍵約束【案例5.3】添加主鍵約束。對(duì)【案例5.2】中的部門表tb_department進(jìn)行完善,將字段department_id添加為主鍵,SQL語句如下。5.2.4使用主鍵約束執(zhí)行上述SQL語句,運(yùn)行結(jié)果如下圖所示。5.2.4使用主鍵約束當(dāng)數(shù)據(jù)表中不需要指定主鍵約束時(shí),可以執(zhí)行“DROP”語句將其刪除,刪除主鍵約束的語法格式如下所示。
說明:(1)表名稱:表示要?jiǎng)h除的主鍵約束的表的名稱;(2)PRIMARYKEY:表示主鍵約束的關(guān)鍵字。由運(yùn)行結(jié)果可以得知:當(dāng)出現(xiàn)“QueryOK”提示信息,則表示成功刪除或創(chuàng)建tb_department數(shù)據(jù)表。也可以執(zhí)行“DESC表名稱;”語句(具體請(qǐng)見5.3.2查看數(shù)據(jù)表結(jié)構(gòu))查看數(shù)據(jù)表的結(jié)構(gòu),發(fā)現(xiàn)department_id字段已添加了主鍵約束。5.2.5使用外鍵約束外鍵約束(ForeignKeyConstraint)是用來在兩個(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)字段中外鍵所在的表為從表。外鍵約束的語法格式如下所示。5.2.5使用外鍵約束
說明:(1)外鍵名:定義外鍵約束的名稱;(2)字段:表示從表需要?jiǎng)?chuàng)建外鍵約束的字段列,可以由多個(gè)列組成;(3)主表名:表示被從表外鍵所依賴的表的名稱;(4)主鍵列:表示被應(yīng)用的表中的列名,也可以由多個(gè)列組成;(5)CONSTRAINT:創(chuàng)建約束的關(guān)鍵字;(6)FROEIGNKEY:表示所創(chuàng)建約束的類型為外鍵約束;(7)REFERENCES:表示被約束的列在主表中的某個(gè)列。5.2.5使用外鍵約束【案例5.4】添加外鍵約束。在數(shù)據(jù)庫學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(db_study)中創(chuàng)建一個(gè)數(shù)據(jù)表,名稱為tb_class,用于保存班級(jí)信息,將班級(jí)號(hào)設(shè)置為主鍵,部門號(hào)設(shè)置為外鍵,則班級(jí)表結(jié)構(gòu)如下表所示。在學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫中創(chuàng)建tb_class數(shù)據(jù)表,按照要求添加外鍵約束的SQL語句如下所示。5.2.5使用外鍵約束在學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫中創(chuàng)建tb_class數(shù)據(jù)表,按照要求添加外鍵約束的SQL語句如下所示。5.2.5使用外鍵約束執(zhí)行上述SQL語句,運(yùn)行結(jié)果如下圖所示。5.2.5使用外鍵約束由運(yùn)行結(jié)果可以得知:成功創(chuàng)建tb_class數(shù)據(jù)表后,可以執(zhí)行“DESC表名稱;”語句(具體請(qǐng)見5.3.2查看數(shù)據(jù)表結(jié)構(gòu))查看數(shù)據(jù)表的結(jié)構(gòu),發(fā)現(xiàn)在tb_class表中已將department_id字段添加了外鍵約束。
說明:(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”語句將其刪除,刪除外鍵約束的語法格式如下所示。
說明:(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è)置在除了主鍵以外的其他列上,語法格式如下所示。
說明:UNIQUE:是唯一約束的關(guān)鍵字?!景咐?.5】添加唯一約束。為了避免班級(jí)名稱重名,需要為其添加唯一約束。對(duì)【案例5.4】中的班級(jí)表tb_class進(jìn)行完善,將班級(jí)名稱設(shè)置為唯一約束,SQL語句如下所示。5.2.6使用唯一約束【案例5.5】添加唯一約束。為了避免班級(jí)名稱重名,需要為其添加唯一約束。對(duì)【案例5.4】中的班級(jí)表tb_class進(jìn)行完善,將班級(jí)名稱設(shè)置為唯一約束,SQL語句如下所示。5.2.6使用唯一約束執(zhí)行上述SQL語句,運(yùn)行結(jié)果如下圖所示。5.2.6使用唯一約束由運(yùn)行結(jié)果可以得知:成功創(chuàng)建完tb_class數(shù)據(jù)表后,可以執(zhí)行“DESC表名稱;”語句(具體請(qǐng)見5.3.2查看數(shù)據(jù)表結(jié)構(gòu))查看數(shù)據(jù)表的結(jié)構(gòu),發(fā)現(xiàn)在tb_class表中已將department_id字段添加了外鍵約束。
說明:(1)同一個(gè)表可以是某一個(gè)列的值唯一,也可以多個(gè)列組合的值唯一;(2)唯一性約束允許列值為空;(3)在創(chuàng)建唯一約束的時(shí)候,如果不給唯一約束命名,就默認(rèn)和列名相同。5.2.7使用AUTO_INCREMENT自增列在數(shù)據(jù)庫應(yīng)用中,需要在每次插入記錄時(shí),系統(tǒng)能自動(dòng)生成字段的主鍵值。可以通過為表主鍵添加“AUTO_INCREMENT”關(guān)鍵字來實(shí)現(xiàn)。當(dāng)主鍵定義為自增長后,這個(gè)主鍵的值就不再需要用戶輸入數(shù)據(jù),而由數(shù)據(jù)庫根據(jù)定義自動(dòng)賦值。每增加一條記錄,主鍵會(huì)自動(dòng)以相同的步長進(jìn)行增長。設(shè)置自增列的語法格式如下所示?!景咐?.6】添加自增列。在數(shù)據(jù)庫學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(db_study)中創(chuàng)建一個(gè)數(shù)據(jù)表,名稱為tb_student,用于保存學(xué)生信息,其中需要將學(xué)號(hào)student_id字段實(shí)現(xiàn)自增長,且初始值為20220101001,學(xué)生表的表結(jié)構(gòu)如下表所示。5.2.7使用AUTO_INCREMENT自增列【案例5.6】添加自增列。在數(shù)據(jù)庫學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫(db_study)中創(chuàng)建一個(gè)數(shù)據(jù)表,名稱為tb_student,用于保存學(xué)生信息,其中需要將學(xué)號(hào)student_id字段實(shí)現(xiàn)自增長,且初始值為20220101001,學(xué)生表的表結(jié)構(gòu)如下表所示。5.2.7使用AUTO_INCREMENT自增列在學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫中創(chuàng)建tb_student數(shù)據(jù)表,按照要求添加自增長的SQL語句如下所示。5.2.7使用AUTO_INCREMENT自增列執(zhí)行上述SQL語句,運(yùn)行結(jié)果如下圖所示。5.2.7使用AUTO_INCREMENT自增列由運(yùn)行結(jié)果可以得知:成功創(chuàng)建完tb_student數(shù)據(jù)表后,可以執(zhí)行“DESC表名稱;”語句(具體請(qǐng)見5.3.2查看數(shù)據(jù)表結(jié)構(gòu))查看數(shù)據(jù)表的結(jié)構(gòu),發(fā)現(xiàn)在tb_student表中已將student_id字段添加了自增列約束。
說明:(1)在默認(rèn)情況下,自增列的初始值為1,每新增一條記錄,字段值自動(dòng)加1;(2)一個(gè)表中只能有一個(gè)字段使用自增列約束,且該字段必須為主鍵或主鍵的一部分;(3)自增列約束只能是整數(shù)類型,例如TINYINT、SMALLINT、INT、BIGINT等。5.2.8使用默認(rèn)值約束默認(rèn)約束(DefaultConstraint)是給某個(gè)字段/某列指定默認(rèn)值,一旦設(shè)置默認(rèn)值,在插入數(shù)據(jù)時(shí),如果此字段沒有顯式賦值,則賦值為默認(rèn)值。例如在1班中的學(xué)生,那么班級(jí)編號(hào)就可以指定默認(rèn)值“01”。如果插入一條新的記錄并且沒有為這個(gè)字段賦值,則系統(tǒng)會(huì)自動(dòng)為班級(jí)編號(hào)這個(gè)字段賦值為“01”。默認(rèn)值約束的語法格式如下所示。
說明:(1)DEFAULT:表示默認(rèn)值約束的關(guān)鍵字;(2)默認(rèn)值:表示一個(gè)具體的值也可以是通過表達(dá)式得到的一個(gè)值,但必須與該字段的數(shù)據(jù)類型相匹配;(3)一個(gè)表可以有很多的默認(rèn)值約束,在創(chuàng)建表時(shí)為列添加默認(rèn)值,可以一次為多個(gè)列添加默認(rèn)值,需要注意不同列的數(shù)據(jù)類型;(4)默認(rèn)值約束意味著,該字段如果沒有手動(dòng)賦值,會(huì)按默認(rèn)值處理。5.2.9使用檢查約束檢查約束(CheckConstraint)是指在進(jìn)行數(shù)據(jù)更新前設(shè)置一些過濾條件,滿足此條件的數(shù)據(jù)可以實(shí)現(xiàn)更新,可以使用“CHECK”關(guān)鍵字可以定義檢查約束。用于檢驗(yàn)輸入值,拒絕接受不滿足條件的值,減少無效數(shù)據(jù)的輸入。檢查約束的語法格式如下所示。
說明:CHECK:表示設(shè)置檢查約束的關(guān)鍵字。雖然有檢查約束這種概念,但是在實(shí)際場景中,會(huì)比較少使用檢查約束,為什么?因?yàn)樗械臋z查約束都是逐個(gè)進(jìn)行過濾,如果在一個(gè)數(shù)據(jù)表上進(jìn)行了過多的檢查約束,在進(jìn)行數(shù)據(jù)更新的時(shí)候會(huì)嚴(yán)重影響程序的性能。比如說:哪里有交警哪里就絕對(duì)堵車,一條路沒有任何障礙物,就能很快通過,但是一旦有個(gè)障礙物,就會(huì)變得很慢。5.2.10查看數(shù)據(jù)表結(jié)構(gòu)在MySQL中使用SQL語句創(chuàng)建好數(shù)據(jù)表之后,可以查看數(shù)據(jù)表的結(jié)構(gòu),確認(rèn)數(shù)據(jù)表的定義是否正確。MySQL支持使用“DESCRIBE/DESC”語句查看數(shù)據(jù)表結(jié)構(gòu),也支持使用“SHOWCREATETABLE”語句查看數(shù)據(jù)表結(jié)構(gòu)。以下是分別介紹這兩種查看數(shù)據(jù)表結(jié)構(gòu)的方法。1.DESCRIBE/DESC語句使用“DESCRIBE/DESC”語句可以查看數(shù)據(jù)表的基本結(jié)構(gòu),語法格式如下所示。
說明:表名稱:表示需要查看數(shù)據(jù)表結(jié)構(gòu)的表的名稱。5.2.10查看數(shù)據(jù)表結(jié)構(gòu)【案例5.7】查看數(shù)據(jù)表的基本結(jié)構(gòu)。使用DESCRIBE/DESC語句查看班級(jí)表tb_class的基本結(jié)構(gòu),SQL語句如下。執(zhí)行上述SQL語句,運(yùn)行結(jié)果如下圖所示。5.2.10查看數(shù)據(jù)表結(jié)構(gòu)由運(yùn)行結(jié)果得知:使用“DESCRIBE表名稱;”和“DESC表名稱;”語句查詢的結(jié)果一樣,可以查看表的字段名稱、字段數(shù)據(jù)類型、是否為主鍵、是否唯一等。其中,各個(gè)字段的含義分別解釋如下。Field:表示字段名稱;Type:表示字段類型,這里CHAR、VARCHAR是文本字符串類型;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語句使用“SHOWCREATETABLE”語句不僅可以查看表創(chuàng)建時(shí)的詳細(xì)語句,還可以查看存儲(chǔ)引擎和字符編碼。語法格式如下所示。【案例5.8】查看數(shù)據(jù)表的詳細(xì)信息。使用“SHOWCREATETABLE”語句查看班級(jí)表tb_class的詳細(xì)信息,SQL語句如下。5.2.10查看數(shù)據(jù)表結(jié)構(gòu)執(zhí)行上述SQL語句,運(yùn)行結(jié)果如下兩圖所示。由運(yùn)行結(jié)果可知:(1)執(zhí)行“SHOWCREATETABLE表名稱;”和“SHOWCREATETABLE表名稱\G”語句查看數(shù)據(jù)表的詳細(xì)信息的結(jié)果是一樣的;(2)\G參數(shù)相當(dāng)于格式化輸出,使用\G之后,可以看到輸出內(nèi)容具有較高的易讀性。修改數(shù)據(jù)表035.3.1重命名表在實(shí)際開發(fā)當(dāng)中,還需要根據(jù)實(shí)際情況來對(duì)數(shù)據(jù)表進(jìn)行修改,當(dāng)需要修改數(shù)據(jù)表的名稱,則可以執(zhí)行“ALTERTABLE”語句來實(shí)現(xiàn)表名稱的修改,具體語法格式如下。其中TO表示為可選參數(shù),使用與否不影響執(zhí)行結(jié)果?!景咐?.9】修改數(shù)據(jù)表的名稱。在已有的數(shù)據(jù)表tb_class中,將tb_class表改為“班級(jí)表”,使用“ALTERTABLE”語句修改新的表名稱,SQL語句如下。5.3.1重命名表執(zhí)行上述SQL語句,再執(zhí)行“SHOWTABLES;”語句查看數(shù)據(jù)表,發(fā)現(xiàn)tb_class表已成功修改為“班級(jí)表”運(yùn)行結(jié)果如下圖所示。5.3.2添加字段在實(shí)際工作當(dāng)中,隨著業(yè)務(wù)需求的變化,可能需要在表中添加新的字段,添加字段時(shí)可以修改字段的排列位置,在MySQL中添加新的字段的語法格式如下。
說明:(1)FIRST是可選參數(shù),其作用是將新添加的字段設(shè)置為表的第一個(gè)字段;(2)AFTER是可選參數(shù),其作用是將新添加的字段添加到指定的“已存在字段名”的后面?!景咐?.10】添加新的字段。對(duì)【案例5.9】中的班級(jí)表進(jìn)行完善。為了統(tǒng)計(jì)每個(gè)班的總?cè)藬?shù),現(xiàn)在需要在班級(jí)表中添加新的字段,并命名為class_size,數(shù)據(jù)類型為TINYINT類型,SQL語句如下。5.3.2添加字段執(zhí)行上述SQL語句,再執(zhí)行“DESC表名稱;”語句查看數(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ù)類型時(shí),可以使用“ALTERTABLE”語句修改字段的數(shù)據(jù)類型,修改字段的數(shù)據(jù)類型一般語法格式如下。
說明:(1)表名稱:表示需要修改數(shù)據(jù)表的名稱;(2)字段名:表示需要添加數(shù)據(jù)類型的字段列;(3)字段類型:表示該字段需要修改的數(shù)據(jù)類型。當(dāng)在創(chuàng)建數(shù)據(jù)表時(shí)沒有添加約束,也可以執(zhí)行“ALTERTABLE”語句進(jìn)行添加或修改,不同的約束有不同的修改方式,以下分別講解在修改數(shù)據(jù)表時(shí)添加約束的語法格式。5.3.2添加字段1.修改數(shù)據(jù)表字段時(shí)添加主鍵約束當(dāng)創(chuàng)建完數(shù)據(jù)表后,如果還需要為數(shù)據(jù)表的某個(gè)字段添加主鍵約束時(shí),可以不需要重新創(chuàng)建數(shù)據(jù)表,可以使用“ALTER”語句為現(xiàn)有的數(shù)據(jù)表添加主鍵,語法格式如下。
說明:(1)約束名:表示需要添加外鍵約束的名稱;(2)字段:表示需要添加外鍵約束的字段列,可以由多個(gè)列組成;(3)CONSTRAINT:需要?jiǎng)?chuàng)建約束的關(guān)鍵字;(4)PRIMARYKEY:表示所添加約束的類型為主鍵約束。5.3.2添加字段2.修改數(shù)據(jù)表字段時(shí)添加外鍵約束如果在創(chuàng)建數(shù)據(jù)表時(shí)沒有創(chuàng)建外鍵,可以使用“ALTER”語句為現(xiàn)有的數(shù)據(jù)表添加外鍵,語法格式如下。
說明:(1)約束名:需要添加的外鍵約束名稱;(2)CONSTRAINT:需要添加約束的關(guān)鍵字;(3)FOREIGNKEY:表示所添加約束的類型為外鍵鍵約束;(4)主鍵列:表示需要被應(yīng)用的表中的列名,也可以由多個(gè)列組成。5.3.2添加字段3.修改數(shù)據(jù)表字段時(shí)添加唯一約束如果在創(chuàng)建數(shù)據(jù)表時(shí)沒有創(chuàng)建唯一約束,可以使用“ALTER”語句為現(xiàn)有的數(shù)據(jù)表添加唯一約束,但是需要保證添加唯一性約束的列中存放的值沒有重復(fù)的。其語法格式如下。
說明:(1)約束名:表示需要添加的唯一約束名稱;(2)字段名:需要設(shè)置唯一約束的字段名稱;(3)UNIQUE:表示唯一約束的關(guān)鍵字。5.3.2添加字段4.修改數(shù)據(jù)表字段時(shí)添加自增性約束如果在創(chuàng)建數(shù)據(jù)表時(shí)沒有創(chuàng)建自增列,可以使用“ALTER”語句為現(xiàn)有的數(shù)據(jù)表添加自增列約束,其語法格式如下。
說明:(1)CHANGE:表示修改列屬性的關(guān)鍵字;(2)UNSIGNED:表示需要自增長的數(shù)值無符號(hào)化;(3)AUTO_INCREMENT:表示自增列約束的關(guān)鍵字。5.3.2添加字段5.修改數(shù)據(jù)表字段時(shí)添加默認(rèn)值約束如果在創(chuàng)建數(shù)據(jù)表時(shí)沒有創(chuàng)建默認(rèn)值約束,可以使用“ALTER”語句為現(xiàn)有的數(shù)據(jù)表添加默認(rèn)值約束,其語法格式如下。
說明:(1)約束名:表示添加默認(rèn)值的約束名;(2)默認(rèn)值:表示具體的一個(gè)值或通過表達(dá)式得到的一個(gè)值,但該值必須與該字段的數(shù)據(jù)類型相匹配。5.3.2添加字段【案例5.11】修改字段的約束條件。在添加class_size字段時(shí),沒有添加唯一性約束,現(xiàn)在給班級(jí)表中的class_size字段添加一個(gè)唯一約束,SQL語句如下。執(zhí)行上述SQL語句,再執(zhí)行“DESC表名稱;”語句查看字段的約束是否修改成功,發(fā)現(xiàn)在班級(jí)表中class_size的字段約束已添加為唯一約束,運(yùn)行結(jié)果如下圖所示。5.3.3重命名字段重命名字段就是把舊的字段名修改一個(gè)新的字段名稱,為了方便開發(fā)人員或數(shù)據(jù)庫維護(hù)人員管理數(shù)據(jù)表,其語法格式如下。
說明:(1)舊字段名:指修改前的字段名稱;(2)新字段名:指修改后字段名稱;(3)新數(shù)據(jù)類型:表示修改后的數(shù)據(jù)類型,如果不需要修改字段的數(shù)據(jù)類型,可以將新數(shù)據(jù)類型設(shè)置與原來的一樣即可,但數(shù)據(jù)類型不能為空。5.3.3重命名字段【案例5.12】修改字段名稱。將班級(jí)表中的class_size字段的名稱修改為“班級(jí)人數(shù)”,數(shù)據(jù)類型不變,SQL語句如下。執(zhí)行上述SQL語句,再執(zhí)行“DESC表名稱;”語句查看字段的名稱是否修改成功,發(fā)現(xiàn)班級(jí)表中class_size的字段已成功修改成新的字段名稱“班級(jí)人數(shù)”,運(yùn)行結(jié)果如下圖所示。5.3.4修改字段的排列位置對(duì)于一個(gè)數(shù)據(jù)表來說,在創(chuàng)建的時(shí)候,字段就在表中的排列順序就已經(jīng)確定了,但表的結(jié)構(gòu)并不是完全不可以改變的,也可以執(zhí)行“ALTERTABLE”語句來改變表中字段的位置,其語法格式如下。
說明:(1)MODIFY:表示修改列屬性的關(guān)鍵字;(2)字段1:表示需要修改位置的字段;(3)數(shù)據(jù)類型:指的是字段1的數(shù)據(jù)類型;(4)字段2:表示需要插入新字段的前一個(gè)字段;(5)FIRST:其作用是將字段1修改為數(shù)據(jù)表中的第一個(gè)字段;(6)AFTER:其作用是將字段1插到字段2的后面。5.3.4修改字段的排列位置【案例5.13】修改字段的排列位置。將班級(jí)表中的班級(jí)人數(shù)字段的位置排列到class_name字段的后面,SQL語句如下。執(zhí)行上述SQL語句,再執(zhí)行“DESC表名稱;”語句查看班級(jí)人數(shù)字段是否排列在class_name字段的后面,發(fā)現(xiàn)在班級(jí)表中班級(jí)人數(shù)字段已排列在class_name字段的后面,運(yùn)行結(jié)果如下圖所示。5.3.5刪除字段在MySQL中,刪除字段就是將數(shù)據(jù)表中的某個(gè)字段從表中移除,其語法格式如下?!景咐?.14】刪除字段。在班級(jí)表中,將剛修改的“班級(jí)人數(shù)”字段刪除掉,SQL語句如下。執(zhí)行上述SQL語句,再執(zhí)行“DESC表名稱;”語句查看班級(jí)人數(shù)字段是否刪除成功,發(fā)現(xiàn)班級(jí)表中的班級(jí)人數(shù)字段已刪除成功,運(yùn)行結(jié)果如下圖所示。刪除數(shù)據(jù)表045.4.1刪除沒有被關(guān)聯(lián)的表刪除沒有被關(guān)聯(lián)的表就是刪除與其他數(shù)據(jù)表沒有關(guān)聯(lián)的表,使用“DROPTABLE”語句刪除,可以一次刪除一個(gè)或多個(gè)沒有被其他表關(guān)聯(lián)的數(shù)據(jù)表,語法格式如下?!景咐?.15】刪除課程表。在數(shù)據(jù)庫學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫中,先創(chuàng)建一個(gè)沒有關(guān)聯(lián)其他數(shù)據(jù)表的表,稱為課程表(tb_course),用于保存課程信息,其中課程號(hào)設(shè)置為主鍵,課程名稱不可以重復(fù),表結(jié)構(gòu)如下表所示。
說明:(1)數(shù)據(jù)表n:表示需要?jiǎng)h除的數(shù)據(jù)表的名稱,可以同時(shí)刪除多個(gè)數(shù)據(jù)表,相互之間用逗號(hào)隔開即可;(2)IFEXISTS:用于在刪除前判斷表是否存在。5.4.1刪除沒有被關(guān)聯(lián)的表【案例5.15】刪除課程表。在數(shù)據(jù)庫學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫中,先創(chuàng)建一個(gè)沒有關(guān)聯(lián)其他數(shù)據(jù)表的表,稱為課程表(tb_course),用于保存課程信息,其中課程號(hào)設(shè)置為主鍵,課程名稱不可以重復(fù),表結(jié)構(gòu)如下表所示。5.4.1刪除沒有被關(guān)聯(lián)的表在學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫中創(chuàng)建tb_course數(shù)據(jù)表,SQL語句如下所示。5.4.1刪除沒有被關(guān)聯(lián)的表執(zhí)行上述SQL語句,再執(zhí)行“SHOWTABLES;”語句查看課程表是否創(chuàng)建成功,運(yùn)行結(jié)果如下圖所示。由運(yùn)行結(jié)果可知,發(fā)現(xiàn)列表中有tb_course表,說明課程表已創(chuàng)建成功。在學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫中課程表tb_course與其他數(shù)據(jù)沒有任何關(guān)聯(lián),當(dāng)想要?jiǎng)h除課程表時(shí),可以直接使用以下SQL語句。執(zhí)行上述SQL語句,再執(zhí)行“SHOWTABLES;”語句查看課程表是否刪除成功,發(fā)現(xiàn)數(shù)據(jù)庫學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫中已經(jīng)沒有課程表了,說明已刪除成功,運(yùn)行結(jié)果如下圖所示。5.4.1刪除沒有被關(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中刪除外鍵的語法格式如下?!景咐?.16】刪除部門表。在數(shù)據(jù)庫學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫中,將部門表tb_department進(jìn)行刪除,但在案例5.4中已經(jīng)將department_id字段設(shè)置為外鍵,如果直接刪除部門表,會(huì)顯示失敗。SQL語句如下。5.4.2刪除被其他關(guān)聯(lián)的主表執(zhí)行上述SQL語句,可以看到直接刪除主表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ùn)行上述SQL語句,運(yùn)行結(jié)果如下圖所示。5.4.2刪除被其他關(guān)聯(lián)的主表由運(yùn)行結(jié)果可知,當(dāng)出現(xiàn)“QueryOK”提示信息,說明已經(jīng)將關(guān)聯(lián)子表的外鍵約束刪除成功,則可以將父表tb_department刪除掉,SQL語句如下。運(yùn)行上述SQL語句,最后再執(zhí)行“SHOWTABLES;”語句查看列表中是否還有數(shù)據(jù)表tb_department,發(fā)現(xiàn)數(shù)據(jù)庫學(xué)習(xí)系統(tǒng)數(shù)據(jù)庫中已經(jīng)沒有tb_department表了,說明已刪除成功,運(yùn)行結(jié)果如下圖所示。課業(yè)任務(wù)055.5
課業(yè)任務(wù)王小明想利用MySQL+Java開發(fā)一個(gè)數(shù)據(jù)庫學(xué)習(xí)系統(tǒng),在熟悉了MySQL數(shù)據(jù)庫的管理后,需熟悉對(duì)數(shù)據(jù)表的管理,并熟練掌握數(shù)據(jù)表的將為后續(xù)開
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 河南省重點(diǎn)中學(xué)2025屆數(shù)學(xué)高三上期末經(jīng)典試題含解析
- 2025屆四川省成都市龍泉驛區(qū)第一中學(xué)校生物高一第一學(xué)期期末檢測模擬試題含解析
- 河北省深州市中學(xué)2025屆高二數(shù)學(xué)第一學(xué)期期末統(tǒng)考模擬試題含解析
- 2025屆上海理工大附中生物高一上期末聯(lián)考試題含解析
- 吉林省長春汽車經(jīng)濟(jì)開發(fā)區(qū)第六中學(xué)2025屆高一數(shù)學(xué)第一學(xué)期期末達(dá)標(biāo)檢測模擬試題含解析
- 2025屆新疆維吾爾自治區(qū)生產(chǎn)建設(shè)兵團(tuán)第二中學(xué)高二數(shù)學(xué)第一學(xué)期期末質(zhì)量檢測試題含解析
- 2025屆吉林省延邊朝鮮族自治州延吉市第二中學(xué)英語高三第一學(xué)期期末預(yù)測試題含解析
- 山東師范大學(xué)附中2025屆生物高三上期末聯(lián)考模擬試題含解析
- 2025屆廣東省梅州市蕉嶺中學(xué)高二數(shù)學(xué)第一學(xué)期期末監(jiān)測模擬試題含解析
- 江蘇省徐州市豐縣中學(xué)2025屆數(shù)學(xué)高三上期末質(zhì)量跟蹤監(jiān)視試題含解析
- 社保費(fèi)征繳培訓(xùn)課件
- 醫(yī)院總務(wù)科培訓(xùn)課件
- 高中生社會(huì)實(shí)踐表模板電子版
- 數(shù)字化系列研究之財(cái)務(wù)數(shù)智化篇:大型集團(tuán)企業(yè)財(cái)務(wù)管理的數(shù)智化
- 學(xué)生輟學(xué)勸返記錄表
- 學(xué)校秋季腹瀉知識(shí)講座
- 設(shè)立招投標(biāo)代理公司可行性研究報(bào)告
- 小學(xué)一年級(jí)禁毒教育
- PCBA工藝管制制程稽查表
- 小學(xué)書法大賽評(píng)價(jià)準(zhǔn)則與打分表
- 《朱蘭質(zhì)量手冊(cè)》課件
評(píng)論
0/150
提交評(píng)論