MySQ数据表设计
數(shù)據(jù)表概念
數(shù)據(jù)表是數(shù)據(jù)庫中的基本對象元素,以記錄(行)和字段(列)組成的二維結(jié)構(gòu)用于存儲(chǔ)數(shù)據(jù)。數(shù)據(jù)表由表結(jié)構(gòu)和表內(nèi)容兩部分組成,先建立表結(jié)構(gòu),然后才能輸入數(shù)據(jù)。數(shù)據(jù)表結(jié)構(gòu)設(shè)計(jì)主要包括字段名稱、字段類型和字段屬性的設(shè)置。
通常情況下,同一個(gè)數(shù)據(jù)庫中可以有多個(gè)數(shù)據(jù)表,但表名必須是唯一的,表中每一條記錄描述了一個(gè)相關(guān)信息的集合,每一個(gè)字段必須為唯一的,每個(gè)字段都需要指定數(shù)據(jù)類型。
數(shù)據(jù)列四大數(shù)據(jù)類型
數(shù)值類數(shù)據(jù)列類型
|數(shù)據(jù)類型|存儲(chǔ)空間|說明|取值范圍|
 | ------------- |-------------| -----|
 |TINYINT|1字節(jié)|非常小的整數(shù)|帶符號值:-128127、無符號值:0255|
 |SMALLINT|2字節(jié)|較小的整數(shù)|帶符號值:-3276832767、無符號值:065535|
 |MEDIUMINT|3字節(jié)|中等大小的整數(shù)|帶符號值:-83886088388607、無符號值:016777215|
 |INT |4字節(jié) |標(biāo)準(zhǔn)整數(shù)| 帶符號值:-21474836482147483647、無符號值:04294967295|
 |BIGINT| 8字節(jié) |大整數(shù) |帶符號值:-263263-1、無符號值:0264-1|
 |FLOAT| 4或8字節(jié)| 單精度浮點(diǎn)數(shù)| 最小非零值:+- 1.175494351E-38、最大非零值:+- 3.402823466E+38|
 |DOUBLE |8字節(jié)| 雙精度浮點(diǎn)數(shù) |最小非零值:+- 2.225073E-308、最大非零值:+- 1.797693E+308|
 |DECIMAL| 自定義| 以字符串形式表示的浮點(diǎn)數(shù)| 取決于存儲(chǔ)單元字節(jié)數(shù)|
整型注意事項(xiàng):
-  INT(3)、SMALLINT(3)等整型后面的數(shù)字不會(huì)影響數(shù)值的存儲(chǔ)范圍,只會(huì)影響顯示 
-  整型后面的數(shù)字只有配合零填充的時(shí)候才有實(shí)際意義。 
 整型后面的數(shù)字可以省略
浮點(diǎn)型注意事項(xiàng):
浮點(diǎn)型后面的數(shù)字會(huì)將存入的數(shù)字四舍五入,例如:把一個(gè)1.234存入FLOAT(6,1)數(shù)據(jù)列中,結(jié)果是1.2,6代表顯示長度,1代表小數(shù)位長度,會(huì)四舍五入。
字符串類數(shù)據(jù)列類型
|數(shù)據(jù)類型|存儲(chǔ)空間|說明|取值范圍|
 | ------------- |-------------| -----|
 |CHAR[(M)] |M字節(jié)| 定長字符串 |M字節(jié)
 |VARCHAR[(M)] |L+1字節(jié) |可變字符串| M字節(jié)
 |TINYBLOB,TINYTEXT |L+1字節(jié) |非常小的BLOB(二進(jìn)制大對象)和文本串 |28-1字節(jié)|
 |BLOB,TEXT |L+2字節(jié) |小BLOB和文本串 |216-1字節(jié)|
 |MEDIUMBLOB,MEDIUMTEXT |L+3字節(jié)| 中等的BLOB和文本串| 224-1字節(jié)|
 |LONGBLOB,LONGTEXT |L+4字節(jié) |大BLOB和文本串| 232-1字節(jié)|
 |ENUM(‘value1’,’value2’…) |1或2字節(jié)| 枚舉:可賦予某個(gè)枚舉成員 |65535個(gè)成員|
 |SET(‘value1’,‘value2’…) |1,2,3,4或8字節(jié)| 集合:可賦予多個(gè)集合成員 |64個(gè)成員|
字符串類型注意事項(xiàng):
-  CHAR和VARCHAR類型的長度范圍都在0~255之間 
 在使用CHAR和VARCHAR類型時(shí),當(dāng)我們傳入的實(shí)際的值的長度大于指定的長度,字符串會(huì)被截取至指定長度
 在使用CHAR類型時(shí),如果我們傳入的值的長度小于指定長度,實(shí)際長度會(huì)使用空格補(bǔ)至指定長度
-  在使用VARCHAR類型時(shí),如果我們傳入的值的長度小于指定長度,實(shí)際長度即為傳入字符串的長度,不會(huì)使用空格填補(bǔ) 
-  CHAR要比VARCHAR效率更高,當(dāng)占用空間較大 
-  BLOB和TEXT類型是可以存放任意大數(shù)據(jù)的數(shù)據(jù)類型 
 BLOB區(qū)分大小寫,TEXT不區(qū)分大小寫
-  ENUM和SET類型是特殊的的串類型,其列值必須從固定的串集中選擇 
- ENUM只能選擇其中一個(gè)值,SET可以選擇多個(gè)值
日期和時(shí)間類數(shù)據(jù)列類型
|數(shù)據(jù)類型|存儲(chǔ)空間|說明|取值范圍|
 | ------------- |-------------| -----|
 |DATE |3 字節(jié)| “YYYY-MM-DD”格式表示的日期值 |1000-01-01~9999-12-31|
 |TIME |3 字節(jié)| “hh:mm:ss”格式表示的時(shí)間值 |-838:59:59-838:59:59|
 |DATETIME| 8 字節(jié) |“YYYY-MM-DD hh:mm:ss”格式 |1000-01-01 00:00:00~9999-12-31|
 |TIMESTAMP| 4 字節(jié)| “YYYYMMDDhhmmss”格式表示的時(shí)間戳 |19700101000000-2037年的某個(gè)時(shí)刻|
 |YEAR |1 字節(jié) |“YYYY”格式的年份值 |1901~2155|
日期類型注意事項(xiàng):
- 存儲(chǔ)日期時(shí),我們可以使用整型來進(jìn)行存儲(chǔ)時(shí)間戳,這樣做便于我們進(jìn)行日期的計(jì)算
NULL值
 NULL值注意事項(xiàng):
-  NULL意味著“沒有值”或“未知值” 
-  可以測試某個(gè)值是否為NULL 
-  不能對NULL值進(jìn)行算術(shù)計(jì)算 
-  對NULL值進(jìn)行算術(shù)運(yùn)算,其結(jié)果還是NULL 
-  0或NULL都意味著假,其余值都意味著真 
數(shù)據(jù)字段屬性
 UNSIGNED
只能用于設(shè)置數(shù)值類型,不允許出現(xiàn)負(fù)數(shù)
 最大存儲(chǔ)長度會(huì)增加一倍
ZEROFILL
只能用于設(shè)置數(shù)值類型,在數(shù)值之前會(huì)自動(dòng)用0補(bǔ)齊不足的位數(shù)
AUTO_INCREMENT
用于設(shè)置字段的自動(dòng)增長屬性,每增加一條記錄,該字段的值會(huì)自動(dòng)加1
NULL和NOT NULL
默認(rèn)為NULL,即插入值時(shí)沒有在此字段插入值,默認(rèn)為NULL值,如果指定了NOT NULL,則必須在插入值時(shí)在此字段填入值
DEFAULT
可以通過此屬性來指定一個(gè)默認(rèn)值,如果沒有在此列添加值,那么默認(rèn)添加此值
創(chuàng)建索引
在MySQL中,主要有四類索引:
- 主鍵索引(PRIMARY KEY)
主鍵索引是關(guān)系數(shù)據(jù)庫中最常見的索引類型,主要作用是確定數(shù)據(jù)表里一條特定的數(shù)據(jù)記錄的位置。我們可以在字段后添加PRIMARY KEY來對字段設(shè)置為主鍵索引。
 注意:
 1.最好為每張表指定一個(gè)主鍵,但不是必須指定。
 2.一個(gè)表只能指定一個(gè)主鍵,而且主鍵的值不能為空
 3.主鍵可以有多個(gè)候選索引(例如NOT NULL,AUTO_INCREMENT)
- 唯一索引(UNIQUE)
唯一索引與主鍵索引一樣,都可以防止創(chuàng)建重復(fù)的值。但是,不同之處在于,每個(gè)數(shù)據(jù)表中只能有一個(gè)主鍵索引,但可以有多個(gè)唯一索引。我們使用關(guān)鍵字UNIQUE對字段定義為唯一索引。
- 常規(guī)索引(INDEX)
常規(guī)索引技術(shù)是關(guān)系數(shù)據(jù)查詢中最重要的技術(shù),如果要提升數(shù)據(jù)庫的性能,索引優(yōu)化是首先應(yīng)該考慮的,因?yàn)樗苁刮覀兊臄?shù)據(jù)庫得到最大性能方面的提升。常規(guī)索引也存在缺點(diǎn):
 1.多占用磁盤空間
 2.會(huì)減慢插入,刪除和修改操作
 3.需要按照索引列上排序格式執(zhí)行
 創(chuàng)建索引我們可以使用INDEX和KEY關(guān)鍵字隨表一同創(chuàng)建。
- 全文索引(FULLTEXT)
全文索引在MySQL中是一個(gè)FULLTEXT類型索引,但FULLTEXT索引只能用于MyISAM表,并且只可以在CHAR、VARCHAR或TEXT類型的列上創(chuàng)建,也允許創(chuàng)建在一個(gè)或多個(gè)數(shù)據(jù)列上。
 但是FULLTEXT是不支持中文全文索引的,所以我們將來會(huì)使用效率更高的全文索引引擎Sphinx。
數(shù)據(jù)表的存儲(chǔ)類型及存儲(chǔ)位置
MySQL支持MyISAM、InnoDB、HEAP、BOB、ARCHIVE、CSV等多種數(shù)據(jù)表類型,在創(chuàng)建一個(gè)新MySQL數(shù)據(jù)表時(shí),可以為它設(shè)置一個(gè)類型。
MyISAM和InnoDB兩種表類型最為重要:
1.MyISAM數(shù)據(jù)表類型的特點(diǎn)是成熟、穩(wěn)定和易于管理。
 2.MyISAM表類型會(huì)產(chǎn)生碎片空間,要經(jīng)常使用OPTIMIZE TABLE命令去清理表空間
 3.MyISAM不支持事務(wù)處理,InnoDB支持
 4.MyISAM不支持外鍵,InnoDB支持
 5.MyISAM表類型的數(shù)據(jù)表效率更高
 6.MyISAM表類型的數(shù)據(jù)表會(huì)產(chǎn)生三個(gè)文件,InnoDB表類型表默認(rèn)只會(huì)產(chǎn)生一個(gè)文件。
字符集
創(chuàng)建表的時(shí)候,如果沒有明確地指定任何字符集,則新創(chuàng)建數(shù)據(jù)表的字符集將由MySQL配置文件里charcter-set-server選項(xiàng)的設(shè)置決定。
在創(chuàng)建數(shù)據(jù)表時(shí)如果需要指定默認(rèn)的字符集與之相同,但MySQL客戶程序在與服務(wù)器通信時(shí)使用的字符集,我們需要使用default-character-set選項(xiàng)或通過SQL命令SET NAMES utf8來指定一個(gè)字符集為utf8.
創(chuàng)建表
創(chuàng)建數(shù)據(jù)表之前,我們應(yīng)該注意:
1.創(chuàng)建數(shù)據(jù)庫(如已存在則不需要?jiǎng)?chuàng)建)
 2.選擇數(shù)據(jù)庫
 3.在該數(shù)據(jù)庫當(dāng)中創(chuàng)建數(shù)據(jù)表
創(chuàng)建數(shù)據(jù)表需要注意:
1.指定數(shù)據(jù)表的名稱(數(shù)據(jù)表不能重名)
 2.指定該表的字段名稱、字段數(shù)據(jù)類型、字段索引
 3.指定表類型和表默認(rèn)字符集(可省略)
建表實(shí)例
| 用戶編號 | id | INT | UNSIGNED NOT NULL AUTO_INCREMENT | 主鍵 | 
| 用戶名稱 | username | VARCHAR(50) | NOT NULL | 普通 | 
| 口令 | userpass | VARCHAR(50) | NOT NULL | 普通 | 
| 聯(lián)系電話 | telno | VARCHAR(20) | NOT NULL | 唯一 | 
| 性別 | sex | ENUM(‘男’,’女’) | NOT NULL DEFAULT ‘男’ | ? | 
| 出生日期 | birthday | DATE | NOT NULL DEFAULT ‘0000-00-00’ | ? | 
CREATE TABLE IF NOT EXISTS `users`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`username` VARCHAR(50) NOT NULL,`userpass` VARCHAR(50) NOT NULL,`telno` VARCHAR(20) NOT NULL UNIQUE,`sex` ENUM('nan','nv') NOT NULL DEFAULT 'nan',`birthday` DATE NOT NULL DEFAULT '0000-00-00',PRIMARY KEY(`id`),INDEX username_index(`username`),INDEX userpass_index(`userpass`) )ENGINE=MyISAM DEFAULT CHARSET=utf8 collate utf8_general_ci ;?
注意事項(xiàng):
1.表的字段之間要使用逗號隔開。
 2.建表的最后一句一定不能有逗號。
 3.表名稱和字段名稱盡量不要使用MySQL系統(tǒng)的關(guān)鍵字
 4.如果一定要使用關(guān)鍵字,我們可以使用反引號將表名稱和字段名稱包含起來來進(jìn)行過濾屏蔽。
 5.使用反引號會(huì)使建表效率增高。
 6.數(shù)據(jù)表名稱和字段名稱不能重名
 7.AUTO_INCREMENT屬性必須依附于主鍵索引或唯一索引
修改數(shù)據(jù)表
修改表的語法:
ALTER TABLE 表名 ACTION;我們可以對表進(jìn)行修改字段,添加字段,刪除字段,添加索引,刪除索引,更改表名稱,更改字段名稱,更改auto_increment屬性的初始值等。
修改字段:
我們使用change或者是modify關(guān)鍵字
ALTER TABLE `uses` CHANGE `username` `uname` VARCHAR(32) NOT NULL; ALTER TABLE `users` MODIFY `username` VARCHAR(32) NOT NULL;由上例可以發(fā)現(xiàn):
change可以改變字段名稱,而modify不可以
添加字段:
我們使用add關(guān)鍵字
ALTER TABLE `uses` ADD `tname` VARCHAR(32) NOT NULL;這樣我們就會(huì)新增一個(gè)tname字段。
刪除字段:
我們使用drop關(guān)鍵字
ALTER TABLE `users` DROP `tname`;這樣我們會(huì)刪除tname字段
添加索引:
我們使用add關(guān)鍵字
ALTER TABLE `uses` ADD INDEX/UNIQUE/PRIMARY KEY 索引名稱(字段名稱)這樣會(huì)在該字段上建立索引(普通索引,唯一索引,主鍵索引)。
刪除索引:
ALTER TABLE `users` DROP INDEX/UNIQUE/PRIMARY KEY 索引名稱;這樣我們會(huì)刪除這個(gè)索引,我們可以使用show indexes from 表名查看當(dāng)前表索引。
更改表名稱:
我們使用rename關(guān)鍵字
ALTER TABLE 舊表名 RENAME AS 新表名將舊表名更改為新表名
更改AUTO_INCREMENT初始值:
ALTER TABLE 表名稱 AUTO_INCREMENT=1將AUTO_INCREMENT的初始值設(shè)置為1
刪除表:
DROP TABLE [IF EXISTS] 表名稱;- 如何啟動(dòng)和停止MySQL數(shù)據(jù)庫服務(wù)(至少兩種)?
- 在命令行模式下如何連接MySQL數(shù)據(jù)庫服務(wù)。
- 在mysql命令提示符下:如何查看當(dāng)前服務(wù)器下的數(shù)據(jù)庫(瀏覽數(shù)據(jù)庫);
- 在mysql命令提示符下:如何選擇進(jìn)入一個(gè)數(shù)據(jù)庫;
- 在mysql命令提示符下:如何查看當(dāng)前庫下的所有表。
- 在mysql命令提示符下:如何如何查看一個(gè)表格的結(jié)構(gòu);
- 在mysql命令提示符下:如何取消當(dāng)前sql命令;
- 在mysql命令提示符下:如何退出數(shù)據(jù)庫;
- 在mysql命令提示符下:如何創(chuàng)建一個(gè)數(shù)據(jù)庫;
- 在mysql命令提示符下:如何刪除一個(gè)數(shù)據(jù)庫;
- 在mysql命令提示符下:如何刪除一個(gè)數(shù)據(jù)表;
-  參考下面圖片,按照要求創(chuàng)建表格,(字段類型和約束只做參考) Paste_Image.png
- 為上面的每個(gè)表都添加10條測試數(shù)據(jù)。
- 修改其中的3條數(shù)據(jù)。
- 刪除每個(gè)表的2條數(shù)據(jù)庫。
轉(zhuǎn)載于:https://www.cnblogs.com/lxlx1798/p/8313603.html
總結(jié)
 
                            
                        - 上一篇: 闪存中的NorFlash、NandFla
- 下一篇: c语言表示次方的方法
