二、本單元知識點概述
(Ⅰ)知識點概述

二、本單元教學目標
(Ⅰ)重點知識目標
1.Mysql的資料型別
2.如何選擇資料型別
3.創建表
4.修改表
5.洗掉表
(Ⅱ)能力目標
1.熟練創建資料庫及洗掉資料庫
2.牢記資料型別
3.熟練表的操作
三、本單元知識詳講
2.1 MySQL資料型別介紹
MySQL資料庫提供了多種資料型別,其中包括整數型別、浮點數型別、定點數型別、 日期和時間型別、字串型別和二進制資料型別,不同的資料型別有各自的特點,使用范 圍不相同,而且,存盤方式也不一樣,本節將詳細講解各種資料型別,首先簡單介紹以下創建表的sql陳述句(create table 表名(欄位1名稱 欄位型別,...))
2.1.1整數型別★★★★★
整數型別是資料庫中最基本的資料型別,標準SQL中支持INTEGER和SMALLINT 這兩類整數型別,MySQL資料庫除了支持這兩種型別以外,還擴展支持了 TINYINT、MEDIUMINT和BIGINT,本小節將講解各種整數型別的取值范圍、存盤的位元組數、特點 等內容,下面從不同整數型別的位元組數、取值范圍等方面進行對比,如表2.1所示,
表2.1 MySQL的整數型別
| 整數型別 | 位元組數 | 無符號數的取值范圍 | 有符號數的取值范圍 |
|---|---|---|---|
| TINYINT | 1 | 0—255 | -128—127 |
| SMALLINT | 2 | 0?65535 | —32768?32767 |
| MEDIUMINT | 3 | 0?16777215 | -8388608?8388607 |
| INT | 4 | 0?4294967295 | —2147483648?2147483647 |
| INTEGER | 4 | 0?4294967295 | —2147483648?2147483647 |
| BIGINT | 8 | 0?18446744073709551615 | -9223372036854775808?9223372036854775807 |
從,表2.1中可以看到,INT型別和INTEGER型別的位元組數和取值范圍都是一樣的,其 實,在MySQL中INT型別和INTEGER型別是一樣的,TINYINT型別占用的位元組最小,只需要1個位元組,因此,其取值范圍是最小的,BIGINT型別占用的位元組最大,需要8個 位元組,因此,其取值范圍是最大的, ? 不同型別的整數型別的位元組數不同,根據型別所占的位元組數可以算出該型別的取值范 圍,例如,TINYINT的空間為1個位元組,1個位元組是8位,那么,TINYINT無符號數的最大值為2的八次方-1,即為255,TINYINT有符號數的最大值為2的七次方-1,即為127,同理可以算出其他不同整數型別的取值范圍,
MySQL支持資料型別的名稱后面指定該型別的顯示寬度,其基本形式如下: 資料型別(顯示寬度) 其中,資料型別引數是整數資料型別的名稱;顯示寬度引數是指定寬度的數值,顯示 寬度是指能夠顯示的最大資料的長度,例如,INT(4)在不指定寬度的情況下,每個整數型別都有默認的顯示寬度, 【示例2-1】下面某表的欄位a、b、c、d和e的資料型別分別為TINYINT, SMALLINT, MEDIUMINT、INT和BIGINT,這些整數型別都沒有設定顯示寬度,都為其默認值,該表的資料型別顯示如下:

從上面結果可以看出各種整數型別的默認顯示寬度,
-
TINYINT型別的默認顯示寬度為 4;
-
SMALLINT型別的默認顯示寬度為6;
-
MEDIUMINT型別的默認顯示寬度為9;
-
INT類 型的默認顯示寬度為11;
-
BIGINT型別的默認顯示寬度為20,
仔細觀察會發現,TINYINT 型別的默認顯示寬度與其有符號數的最小值的顯示寬度相同,因為此處負號是占一個位置 的,依此類推,其他整數型別的默認顯示寬度與其有符號數的最大值的顯示寬度相同,這 個可以理解為,.一個資料型別的默認顯示寬度剛好能顯示該資料型別的所有值,
2.1.2 浮點數型別和定點數型別★★★★
MySQL中使用浮點數型別和定點數型別來表示小數,浮點數型別包括單精度浮點數 (FLOAT型)和雙精度浮點數(DOUBLE型),定點數型別就是DECIMAL型,本小節中將講解FLOAT型、DOUBLE型和DECIMAL型的取值范圍、存盤的位元組數和特點等內容, 下面從這三種型別的位元組數、取值范圍等方面進行對比,如表2.2所示,
表2.2 MySQL的浮點數型別和定點數型別
| 整數型別 | 位元組數 | 負數的取值范圍 | 非負數的取值范圍 |
|---|---|---|---|
| FLOAT | 4 | -3.402823466E+38 ?-1.175494351E-38 | 0 和 1.175494351E—38?3.402823466E+38 |
| DOUBLE | 8 | -1.7976931348623157E+308?-2.225073 8585072014E-308 | 0 和 2.2250738585072014E-308?1.7976931348623157E+308 |
| DECIMAL(M,D) 或 DEC(M,D) | M+2 | 同DOUBLE型 | 同DOUBLE型 |
從上面表中可以看到,DECIMAL型的取值范圍與DOUBLE相同,但是,DECIMAL的有效取值范圍由M和D決定,而且,DECIMAL型的位元組數是M+2,也就是說,定點數的存盤空間是根據其精度決定的, MySQL中可以指定浮點數和定點數的精度,其基本形式如下: 資料型別(M,D) ? 其中,“資料型別”引數是浮點數或定點數的資料型別名稱;
-
M:這個欄位的長度
-
D:有幾位小數 這個沒有精度丟失,經常用來表示金錢
例如,FLOAT(6,2) 的含義資料FLOAT型,資料長度為6,小數點后保留2位,按此定義,1234.56是符合要 求的,
注意:上述指定小數精度的方法雖然都適合于浮點數和定點數,但不是浮點數的標準用法,建議在定義浮點數時,如果不是實際情況需要,最好不要使用,如果使用了,可能會影響資料庫的遷移,對定點數而言,DECIMAL(M,D)是定點數的標準格式, 一般情況下可以選擇這種資料型別,
如果插入值的精度高于實際定義的精度,系統會自動進行四舍五入處理,使值的精度 達到要求,不同的是,FLOAT型和DOUBLE型在四舍五入時不會報錯,而DECIMAL型 會有警告,
【示例2-2】下面某表的欄位a、b和c的資料型別分別是FLOAT(6,2)、DOUBLE(6,2) 和DECIMAL(6,2),向表中插入3.143、3.145和3.1434,其顯示結果如下:

如果不指定精度,浮點數和定點數有其默認的精度,FLOAT型和DOUBLE型默認會保存實際精度,但這與作業系統和硬體的精度有關,DECIMAL型默認整數位為10,小數 位為0,即默認為整數,
【示例2-3】下面某表的欄位a、b和c的資料型別分別是FLOAT、DOUBLE和 DECIMAL,向表中插入3.143、3.145和3.1434,其顯示結果如下:

上面程式結果顯示,欄位a和b是按照實際精度保存的,而欄位c進行了四舍五入處理,而且沒有小數位,
在MySQL中,定點數以字串形式存盤,因此,其精度比浮點數要高,而且, 浮點數會出現誤差,這是浮點數一直存在的缺陷,如果要對資料的精度要求比較高,還是選擇定點數(DECIMAL )比較安全,
2.1.3 日期與時間型別★★★★
日期與時間型別是為了方便在資料庫中存盤日期和時間而設計的, MySQL中有多種表示日期和時間的資料型別,其中,
-
YEAR型別表示時間;
-
DATE型別表示日期;
-
TIME 型別表示時間;
-
DATETIME和TIMESTAMP表示日期和時間,
本小節將介紹上述型別的存盤的位元組數、取值范圍和特點,
下面從這5種日期與時間型別的位元組數、取值范圍和零值等方面進行對比,如表2.3所示, 表2.3 MySQL的日期與時間型別
| 整數型別 | 位元組數 | 取值范圍 | 零 值 |
|---|---|---|---|
| YEAR | 1 | 1901?2155 | 0000 |
| DATE | 4 | 1000-01-01 ?9999-12-31 | 0000:00:00 |
| TIME | 3 | 一838:59:59?838:59:59 | 00:00:00 |
| DATETIME | 8 | 1000-01-01 00:00:00?9999-12-31 23:59:59 | 0000-00-00 00:00:00 |
| TIMESTAMP | 4 | 19700101080001-20380119111407 | 00000000000000 |
從上表中可以看到,每種日期與時間型別都有一個有效范圍,如果插入的值超過了這個范圍,系統會報錯,并將零值插入到資料庫中,不同的日期與時間型別有不同的零值,上表中已經詳細列出,
YEAR型別使用1個位元組來表示年份,MySQL中以YYYY的形式顯示YEAR型別的 值,給YEAR型別的欄位賦值的表示方法如下: 使用4位字串或數字表示,其范圍從1901?2155,輸入格式為'YYYY,或YYYY, 例如,輸入'2008'或者2008,可直接保存為2008,如果超過了范圍,就會插入0000,
【示例2-4】下面某表的欄位a的資料型別是YEAR型別,向表中插入1997、'1998' 和'1900',其顯示結果如下:

結果顯示,1997和1998直接存盤到欄位a中,而1900沒有插入到欄位a中,而是顯示 0000 ,此處還有“Out of range value for column a at row 1"的警告資訊,
TIME型別使用3個位元組來表示時間,MySQL中以HH:MM:SS的形式顯示TIME類 型的值, 其中,
-
HH表示時;
-
MM表示分,取值范圍為0?59;
-
SS表示秒,取值范圍是0? 59;
-
TIME型別的范圍可以從'-838:59:59'?'838:59:59',
雖然,小時的范圍是0?23, 但是為了表示某種特殊需要的時間間隔,將TIME型別的范圍擴大了,而且,還支持了負值,TIME型別的欄位賦值的表示方法如下, 'D HH:MM:SS'格式的字串表示,其中,D表示天數,取值范圍是0?34,保存時,小時的值等于(D*24+HH),例如,輸入'2 11:30:50' , TIME型別會轉 換為59:30:50,當然,輸入時可以不嚴格按照這個格式,也可以是“HH:MM:SS”、HH:MM”、“DHH:MM”、“DHH” 或者 “SS” 等形式,例如,輸入'30', TIME型別會轉換為00:00:30, 【示例2-5】下面某表的欄位a的資料型別是TIME型別,向表中插入'2 23:50:50'、‘22:22:22’、'11:11'、'2 20:20'、'2 20'和'30',其顯示結果如下:

結果顯示,‘223:50:50’ 轉換為 71:50:50;‘11:11’轉換為 11:11:00;20:20,轉換為 68:20:00;‘2 20’轉換為 68:00:00; '30'轉換為 00:00:30,
HHMMSS'格式的字串或HHMMSS格式的數值表示,例如,輸入'345454', TIME型別會轉換為34:54:54;輸入值為數值345454, TIME型別也會轉換為34:54:54,如果輸入0和'0',那么TIME型別會轉換為0000:00:00, 【示例2-6】下面某表的欄位a的資料型別是TIME型別,向表中插入121212、 '131313'、 '0'和0,其顯示結果如下:

結果顯示,121212轉換為12:12:12;‘131313’轉換為13:13:13; '0'和0轉換為 00:00:00,如果分鐘和秒鐘大于60時,系統會出現“Out of range value for column 'a* at row 1”這樣的警告資訊,
使用CURRENT TIME或者NOW,輸入當前系統時間, 【示例2-7】下面某表的欄位a的資料型別是TIME型別,向表中插入CURRENT_TIME和NOW(),其顯示結果如下:

結果顯示,CURRENTJTIME和NOW()都轉換為當前系統時間,因此,如果要獲取當 前的系統時間,最好選擇CURRENTJTIME和NOW(), ? 一個合法的TIME值,如果超出TIME的范圍,將被裁為范圍最接近的端點,如, '880:00:00'被轉換為838:59:59,無效TIME值,在命令列下是無法被插入到表中的, ? 注意:如果插入的TIME值是無效的,系統會提示“ERROR 1292 (22007): Incorrect time value5,.即使這個無效值被插入到表中,其值也會被轉換為00:00:00,例如, '877034'就是一個無效的值,因為分鐘部分超出了范圍,TIME型別專門用來存盤時間資料,而且只占3個位元組,如果只需要記錄時間,選擇TIME型別是最合適的,
DATE型別使用4個位元組來表示日期,MySQL中是以YYYY-MM-DD的形式顯示 DATE型別的值,其中,YYYY表示年;MM表示月;DD表示日,DATE型別的范圍可 以從,1000-01-01,?‘9999-12-31',
給DATE型別的欄位賦值的表示方法如下: ? 'YYYY-MM-DD'或'YYYYMMDD'格式的字串表示,這種方式可以表達的 范圍是'1000-01-01'?‘9999-12-31’,例如,輸入'4008-2-8,, DATE 型別 將轉換為 4008-02-08;輸入'20220308' , DATE 型別將轉換為 2022-03-08
MySQL中還支持一些不嚴格的語法格式,任何標點都可以用來做間隔符, 如 'YYYY/MM/DD'、'YYYY@MM@DD'、'YYYY.MM.DD'等分隔形式,例如,輸 入'2011.3.8' , DATE 型別將轉換為 2011-03-08,
【示例2-8】下面某表的欄位a的資料型別是DATE型別, 向表中插入'1949-10-01'、'1950#2#3'、'1951@3@4'和'19520101',其顯示結果如下:

結果顯示,'1949-10-01'保持原樣的保存到欄位中;'1950#2#3'轉換為1950-02-03; '1951@3@4'轉換為 1951-03-04; '19520101'轉換為 1952-01-01,
雖然MySQL支持DATA型別的一些不嚴格的語法格式,但是,在實際應用中, 最好還是選擇標準形式,日期中使用做分隔符,時間用“:”做分隔符,如 果有特殊需要,可以使用“@”、"*”等特殊字符做分隔符,
DATETIME型別使用8個位元組來表示日期和時間,MySQL中以'YYYY-MM-DD HH:MM:SS'的形式顯示DATETIME型別的值,從其形式可以看出.,DATETIME型別可 以直接用DATE型別和TIME型別組合而成,
給DATETIME型別的欄位賦值的表示方法 如下: ? 'YYYY-MM-DDHH:MM:SS'或'YYYYMMDDHHMMSS'格式的字串表示, 這種方式可以表達的范圍是 41000-01-01 00:00:00'?'9999-12-31 23:59:59', 例如,輸入 2008-08-08 08:08:08 , DATETIME 型別轉換為 2008-08-08 08:08:08; 輸入'20080808080808',同樣轉換為 2008-08-08 08:08:08,
MySQL中還支持一些不嚴格的語法格式,任何標點都可以用來做間隔符,情況與 DATE型別相同,而且,時間部分也可以用任意分隔符隔開,這與TIME型別不同,TIME 型別只能用“:”隔開,例如,輸入'2008@08@08 080808',同樣轉換為2008-08-08 08:08:08, 【示例2-9]下面某表的欄位a的資料型別是DATETIME型別,向表中插入 '1949-10-01 11:11:11'、'1950#2#3 11+11+11'和'19510101121212' ,其顯示結果如下,

結果顯示,'1949-10-01 11:11:11'直接存盤到欄位中;'1950#2#3 11+11+11'轉換 為 1950-02-03 11:11:11; '19510101121212'轉換為 1951-01-01 12:12:12,
TIMESTAMP型別使用4個位元組來表示日期和時間,
TIMESTAMP型別的范圍是從 1970-01-01 08:00:01—2038-01-19 11:14:07,MySQL 中也是以'YYYY-MM-DD HH:MM:SS' 的形式顯示TIMESTAMP型別的值,
從其形式可以看出,TIMESTAMP型別與DATETIME型別顯示的格式是一樣的,給TIMESTAMP型別的欄位賦值的表示方法基本與DATETIME型別相同,值得注意的是,TIMESTAMP型別范圍比較小,沒有DATETIME型別的范圍 大,因此,輸入值時要保證在TIMESTAMP型別的有效范圍內, 【示例2-10】下面某表的欄位a的資料型別是TIMESTAMP型別,向表中插入 1979-10-01 11:11:11'、,1970#2#3 11+11+11'、19710101121212'、28-01-01、'33@1@1 1111*11'、'790101121212'、20080808080808090101080808、0 和 NOW(), 其顯示結果如下:

結果顯示,'1970#2#3 11+11+11 轉換為 1970-02-03 11:11:11; '33@1@1 111111' 轉換為 2033-01-01 11:11:11:090101080808 轉換為 2009-01-01 08:08:08;0轉換為 0000-00-00 00:00:00; NOW,轉換為系統當前時間,
2.1.4 字串型別★★★★★
字串型別是在資料庫中存盤字串的資料型別,字串型別包括CHAR、VARCHAR, BLOB、TEXT、ENUM和SET, 1.CHAR型別和VARCHAR型別
CHAR型別和VARCHAR型別都是在創建表時指定了最大長度,其基本形式如下:
其中,"字串型別”引數指定了資料型別為CHAR型別還是VARCHAR型別;M 引數指定了該字串的最大長度為M,例如,CHAR(4)就是指資料型別為CHAR型別,其 最大長度為4,
CHAR型別的長度是固定的,在創建表時就指定了,其長度可以是0-255的任意值, 例如,CHAR(IOO)就是指定CHAR型別的長度為100,
VARCHAR型別的長度是可變的,在創建表時指定了最大長度,定義時,其最大值可 以取0?65535之間的任意值,指定VARCHAR型別的最大值以后,其長度可以在,到最 大長度之間,
例如,VARCHAR(IOO)的最大長度是100,但是,不是每條記錄都要占用100 個位元組,而是在這個最大值范圍內,使用多少分配多少,VARCHAR型別實際占用的空間 為字串的實際長度加1,這樣,即可有效節約系統的空間,
【示例2-11】下面向CHAR(5)與VARCHAR(5)中存入不同長度的字串,將資料庫 中的存盤形式和占用的位元組數進行對比,如表2.4所示,
表 2.4 CHAR(5)與VARCHAR(5)的對比
| 插入值 | CHAR(5) | 占用位元組數 | VARCHAR(5) | 占用位元組數 |
|---|---|---|---|---|
| '' | <, | 5個位元組 | '' | 1個位元組 |
| '1' | '1' | 5個位元組 | '1' | 2個位元組 |
| '123' | ‘123, | 5個位元組 | ‘123' | 4個位元組 |
| '123 ' | '123' | 5個位元組 | '123' | 5個位元組 |
| ‘12345’ | '12345' | 5個位元組 | '12345' | 6個位元組 |
表2.4顯示,CHAR(5)所占用的空間都是5個位元組,這表示CHAR(5)的固定長度就是 5個位元組,而VARCHAR(5)所占的位元組數是實際長度的基礎上加1,因為字串的結束標志符占用了 1個位元組,從表的第三行可以看到,VARCHAR將字串'123 '最后面的空格依然保留著,為了確認空格是否保留,將所有資料后面加上“*”字符,結果顯示如下:

由此可見,VARCHAR型別將'123 '最后面的空格保留著,而CHAR型別中將,123后面的空格自動洗掉了, 注意:如果CHAR和VARCHAR的長度為5,而插入的值為*123456',那么系統會 阻止這個值的插入,并且會報錯,錯誤資訊是“ERROR 1406 (22001): Data too long for column”,這說明插入的字串的長度已經大于了可以插入的最大值,
TEXT型別是一種特殊的字串型別,TEXT只能保存字符資料,如新聞的內容等, TEXT 型別包括 TINYTEXT. TEXT、MEDIUMTEXT 和 LONGTEXTo 下面將從 4 種 TEXT 型別允許的長度和存盤空間進行對比,如表2.5所示,
表2.5各種TEXT型別的對比
| 類 型 | 允許的長度 | 存盤空間 |
|---|---|---|
| TINYTEXT | 0-255位元組 | 值的長度+2個位元組 |
| TEXT | 0-65535 位元組 | 值的長度+2個位元組 |
| MEDIUMTEXT | 0—167772150 位元組 | 值的長度+3個位元組 |
| LONGTEXT | 0-4294967295 位元組 | 值的長度+4個位元組 |
從表2.5可以看出,各種TEXT型別的區別在于允許的長度和存盤空間不同,因此在 這幾種TEXT型別中,根據需求選取既能滿足需要又最節約空間的型別即可,
2.2 如何選擇資料型別
在MySQL中創建表時,需要考慮為欄位選擇哪種資料型別是最合適的,只有選擇了合適的資料型別,才能提高資料庫的效率,本小節將講解選擇資料型別的原則,
2.2.1 整數型別和浮點數型別★★★★
整數型別和浮點數型別最大的區別在于能否表達小數,整數型別不能表示小數,而浮 點數型別可以表示小數,不同的整數型別的取值范圍不同,TINYINT型別的取值范圍為0? 255,如果欄位的最大值不超過255,那選擇TINYINT型別就足夠了,BIGINT型別的取值 范圍最大,最常用的整數型別是INT型別, ? 浮點數型別包括FLOAT型別和DOUBLE型別,DOUBLE型別的精度比FLOAT型別 高,如果需要精確到小數點后10位以上,就應該選擇DOUBLE型別,而不應該選擇FLOAT型別,
2.2.2 浮點數型別和定點數型別★★★★
對于浮點數和定點數,當插入值的精度高于實際定義的精度時,系統會自動進行四舍 五入處理,其目的是為了使該值的精度達到要求,浮點數進行四舍五入時系統不會報警, 定點數會岀現警告, ? 在未指定精度的情況下,浮點數和定點數有其默認的精度,FLOAT型和DOUBLE型 默認會保存實際精度,這個精度與作業系統和硬體的精度有關,DECIMAL型默認整數位 為10,小數位為0,即默認為整數, ? 在MySQL中,定點數精度比浮點數要高,而且,浮點數會岀現誤差,如果要對資料 的精度要求比較高,應該選擇定點數,
2.2.3 char型別和varchar型別★★★★★
CHAR型別的長度是固定的,而VARCHAR型別的長度是在范圍內可變的,因此, VARCHAR型別占用的空間比 CHAR型別小, ? 而且,VARCHAR型別比CHAR型別靈活, 對于長度變化比較大的字串型別,最好是選擇VARCHAR型別, ? 雖然CHAR型別占用的空間比較大,但是CHAR型別的處理速度比VARCHAR快, 因此,對于長度變化不大和查詢速度要求較高的字串型別,最好選擇CHAR型別,
2.3創建表
創建表是指在已存在的資料庫中建立新表,這是建立資料庫最重要的一步,是進行其他表操作的基礎,
2.3.1 創建表的語法形式★★★★
MySQL中,創建表是通過SQL陳述句CREATE TABLE實作的,其語法形式如下,
CREATE TABLE 表名(屬性名 資料型別[完整性約束條件],
屬性名 資料型別[完整性約束條件],
:
屬性名 資料型別 );
其中,“表名”引數表示所要創建的表的名稱;“屬性名”引數表示表中欄位的名稱; "資料型別"引數指定欄位的資料型別,“完整性約束條件”引數指 定欄位的某些特殊約束條件, ? 注意;在使用CREATE TABLE陳述句創建表時,首先要使用USE陳述句選擇資料庫,選擇資料庫陳述句的基本格式為“USE資料庫名”,如果沒有選擇資料庫,創建表時 會出現 aERROR 1046 (3D000): No database selected"錯誤, ? 表名不能為SQL語言的關鍵字,如create、update和order等都不能做表名,一個表中可以有一個或多個屬性,定義時,字母大小寫均可,各屬性之間用逗號隔開,最后一個屬性后不需要加逗號,
【示例3-1】 下面創建一個表名為exampleO的表,SQL代碼如下:
CREATE TABLE example0(id INT, name VARCHAR(20), sex BOOLEAN );

表3.1完整性約束條件表
| 約束條件 | 說 明 |
|---|---|
| PRIMARY KEY | 標識該屬性為該表的主鍵,可以唯一的標識對應的元組 |
| FOREIGN KEY | 標識該屬性為該表的外鍵,是與之聯系的某表的主鍵 |
| NOT NULL | 標識該屬性不能為空 |
| UNIQUE | 標識該屬性的值是唯一的 |
| AUTO INCREMENT | 標識該屬性的值自動增加,這是MySQL的SQL陳述句的特色 |
| DEFAULT | 為該屬性設定默認值 |
2.3.2 設定表的主鍵★★★
主鍵的主要目的是幫助MySQL以最快的速度查找到表中的某一條資訊,主鍵必須滿 足的條件就是主鍵必須是唯一的,表中任意兩條記錄的主鍵欄位的值不能相同;主鍵的值是非空值,主鍵可以是單一的欄位,也可以是多個欄位的組合,
1.單欄位主鍵 主鍵是由一個欄位構成時,可以直接在該欄位的后面加上PRIMARY KEY來設定主 鍵,語法規則如下:
屬性名資料型別PRIMARY KEY
其中,“屬性名”引數表示表中欄位的名稱;“資料型別”引數指定欄位的資料型別, 【示例3-2】 下面在example 1表中設定stu_id作為主鍵,SQL代碼如下:
CREATE TABLE example1 ( stujd INT PRIMARY KEY, stu_name VARCHAR(20), stu_sex BOOLEAN );
代碼運行后,example1表中包含3個欄位,stu_id欄位是整型;stu_name欄位是字符 串型;stu_sex是布爾型,其中,stu_id欄位是主鍵,
2.多欄位主鍵 主鍵是由多個屬性組合而成時,在屬性定義完之后統一設定主鍵,語法規則如下: PRIMARY KEY(屬性名1,屬性名2,…,屬性名n) 【示例3-3】下面在example2表中設定stu id與course id兩個欄位為主鍵,SQL代碼 如下:
CREATE TABLE example2( stu_id INT, coursejd INT, grade "FLOAT, PRIMARY KEY(stu_id, coursejd) );
代碼運行后,example2表中包含3個欄位,其中,stu_id和course id兩個欄位成為主鍵;stu id和course_id兩者的組合可以確定唯一的一條記錄,
2.3.3 設定表的外鍵★★★
外鍵的作用是建立該表與其父表的關聯關系,父表中洗掉某條資訊時,子表中與之對應的資訊也必須有相應的改變,
【示例3-4】下面在example3表中設定stu_id和course_id為外鍵,與之相關聯的是 example 1表中的主鍵stu id和course_id,SQL代碼如下:
CREATE TABLE example3( id INT PRIMARY KEY, stu_id INT, coursejd INT, CONSTRAINT c_fk FOREIGN KEY (stu_id, coursejd) REFERENCES example2(stu_id, coursejd) );
注意:子表的外鍵關聯的必須是父表的主鍵,而且,資料型別必須是一致,例如,兩者都是INT型別,或者都是CHAR型別,如果不滿足這樣的要求,在創建子表時, 就會出現"ERROR 1005 (HY000): Can't create table"錯誤,
2.3.4 設定表的非空約束★★★
非空性是指欄位的值不能為空值(NULL),非空約束將保證所有記錄中該欄位都有值,
下面在example4表中設定欄位id和name的非空約束,SQL代碼如下:
CREATE TABLE example4( id INT NOT NULL PRIMARY KEY, name VARCHAR(20) NOT NULL );
2.3.5 設定表的唯一性約束★★★
唯一性是指所有記錄中該欄位的值不能重復出現,設定表的唯一性約束是指在創建表時,為表的某些特殊欄位加上UNIQUE約束條件,唯一性約束將保證所有記錄中該欄位的值不能重復出現,
【示例3-6】下面在examples表中設定欄位id和stu_id的唯一性約束,SQL代碼如下:
CREATE TABLE example5( id INT PRIMARY KEY, stujd INT UNIQUE, name VARCHAR(20) NOT NULL );
2.3.6 設定表的屬性的默認值★★★
在創建表時可以指定表中欄位的默認值,如果插入一條新的記錄時沒有為這個欄位賦值,那么資料庫系統會自動為這個欄位插入默認值,默認值是通過DEFAULT關鍵字來設定的,
CREATE TABLE example7( id INT PRIMARY KEY AUTO_INCREMENT, stujd INT UNIQUE, name VARCHAR(20) NOT NULL, English VARCHAR(20) DEFAULT 'zero' );
2.4 查看表結構
2.4.1查看表結構★★★
SHOW CREATE TABLE example1
查看表結構是指查看資料庫中已存在的表的定義,查看表結構的陳述句包括DESCRIBE陳述句和SHOW CREATE TABLE陳述句,通過這兩個陳述句,可以查看表的欄位名、欄位的資料型別和完整性約束條件等,
DESCRIBE example1;
DESC examplel;
代碼運行后,結果顯示如下:

2.4.2 查看表的詳細結構SHOW CREATE TABLE★★★
SHOW CREATE TABLE example1
技巧:如果直接使用SHOW CREATE TABLE examplel陳述句,結果的顯示效果會比較差,尤其是遇到內容比較長的記錄,顯示的結果會很混亂,代碼最后加上“\G” 引數,可以更加美觀的顯示內容,對內容比較長的記錄效果尤為明顯,
2.5修改表
修改表是指修改資料庫中已存在的表的定義,修改表比重新定義表簡單,不需要重新加載資料,也不會影響正在進行的服務,MySQL中通過ALTER TABLE陳述句來修改表, 修改表包括修改表名、修改欄位資料型別、修改欄位名、增加欄位、洗掉欄位、修改欄位 的排列位置、更改默認存盤引擎和洗掉表的外鍵約束等
2.5.1 修改表名★★★
SHOW CREATE TABLE example1
表名可以在一個資料庫中唯一的確定一張表,資料庫系統通過表名來區分不同的表,
ALTER TABLE 舊表名 RENAME 新表名;
2.5.2 修改欄位的資料型別★★★★
SHOW CREATE TABLE example1
SHOW CREATE TABLE example1
欄位的資料型別包括整數型、浮點數型、字串型、二進制型別、日期和時間型別等,
ALTER TABLE 表名 MODIFY 屬性名 資料型別;
2.5.3 修改欄位名★★★
SHOW CREATE TABLE example1
段名可以在一張表中唯一的確定一個欄位,資料庫系統通過欄位名來區分表中的不同欄位.
ALTER TABLE 表名 CHANGE 舊屬性名 新屬性名 新資料型別;
2.5.4增加欄位★★★
SHOW CREATE TABLE example1
-
増加無完整性約束條件的欄位
ALTER TABLE 表名 ADD 欄位名 資料型別;
-
増加有完整性約束條件的欄位
ALTER TABLE user ADD age INT(4) NOT NULL:
2.5.5洗掉欄位★★★
SHOW CREATE TABLE example1
洗掉欄位是指洗掉已經定義好的表中的某個欄位,
ALTER TABLE 表名 DROP 欄位名;
2.5.6修改欄位的排列位置★★★
SHOW CREATE TABLE example1
-
欄位修改到第一個位置
ALTER TABLE user MODIFY name VARCHAR(30) FIRST:
-
欄位修改到指定位置
ALTER TABLE user MODIFY sex TINYINT(1) AFTER phone;
2.6洗掉表
洗掉表是指洗掉資料庫中已存在的表,洗掉表時,會洗掉表中的所有資料,
2.6.1洗掉沒有被關聯的普通表★★★★
DROP TABLE 表名;
2.6.2洗掉被其他表關聯的父表★★★★
執行ALTER TABLE陳述句,洗掉 example4表的外鍵約束,洗掉example4表的外鍵的SQL陳述句如下:
ALTER TABLE example4 DROP FOREIGN KEY d_fk;
查詢結果顯示,example4表中已經不存在外鍵了,現在,已經消除了 example4表與 example1表的關聯關系,即可直接使用DROP TABLE陳述句洗掉example1表,SQL代碼如下:
DROP TABLE example1;
四、本單元知識總結
1.Mysql的資料型別
2.如何選擇資料型別
3.創建和洗掉資料庫
4.修改資料庫
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/309045.html
標籤:MySQL
上一篇:一口氣看完MySQL--上篇
