13.MySQ數(shù)據(jù)表設(shè)計

數(shù)據(jù)表概念

數(shù)據(jù)表是數(shù)據(jù)庫中的基本對象元素,以記錄(行)和字段(列)組成的二維結(jié)構(gòu)用于存儲數(shù)據(jù)。數(shù)據(jù)表由表結(jié)構(gòu)和表內(nèi)容兩部分組成,先建立表結(jié)構(gòu),然后才能輸入數(shù)據(jù)。數(shù)據(jù)表結(jié)構(gòu)設(shè)計主要包括字段名稱、字段類型和字段屬性的設(shè)置。

通常情況下,同一個數(shù)據(jù)庫中可以有多個數(shù)據(jù)表,但表名必須是唯一的,表中每一條記錄描述了一個相關(guān)信息的集合,每一個字段必須為唯一的,每個字段都需要指定數(shù)據(jù)類型。

數(shù)據(jù)列四大數(shù)據(jù)類型

數(shù)值類數(shù)據(jù)列類型

數(shù)據(jù)類型 存儲空間 說明 取值范圍
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é) 單精度浮點數(shù) 最小非零值:+- 1.175494351E-38、最大非零值:+- 3.402823466E+38
DOUBLE 8字節(jié) 雙精度浮點數(shù) 最小非零值:+- 2.225073E-308、最大非零值:+- 1.797693E+308
DECIMAL 自定義 以字符串形式表示的浮點數(shù) 取決于存儲單元字節(jié)數(shù)
整型注意事項:
  • INT(3)、SMALLINT(3)等整型后面的數(shù)字不會影響數(shù)值的存儲范圍,只會影響顯示

  • 整型后面的數(shù)字只有配合零填充的時候才有實際意義。
    整型后面的數(shù)字可以省略

浮點型注意事項:

浮點型后面的數(shù)字會將存入的數(shù)字四舍五入,例如:把一個1.234存入FLOAT(6,1)數(shù)據(jù)列中,結(jié)果是1.2,6代表顯示長度,1代表小數(shù)位長度,會四舍五入。

字符串類數(shù)據(jù)列類型

數(shù)據(jù)類型 存儲空間 說明 取值范圍
CHAR[(M)] M字節(jié) 定長字符串 M字節(jié)
VARCHAR[(M)] L+1字節(jié) 可變字符串 M字節(jié)
TINYBLOB,TINYTEXT L+1字節(jié) 非常小的BLOB(二進制大對象)和文本串 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é) 枚舉:可賦予某個枚舉成員 65535個成員
SET(‘value1’,‘value2’…) 1,2,3,4或8字節(jié) 集合:可賦予多個集合成員 64個成員
字符串類型注意事項:
  • CHAR和VARCHAR類型的長度范圍都在0~255之間
    在使用CHAR和VARCHAR類型時,當(dāng)我們傳入的實際的值的長度大于指定的長度,字符串會被截取至指定長度
    在使用CHAR類型時,如果我們傳入的值的長度小于指定長度,實際長度會使用空格補至指定長度

  • 在使用VARCHAR類型時,如果我們傳入的值的長度小于指定長度,實際長度即為傳入字符串的長度,不會使用空格填補

  • CHAR要比VARCHAR效率更高,當(dāng)占用空間較大

  • BLOB和TEXT類型是可以存放任意大數(shù)據(jù)的數(shù)據(jù)類型
    BLOB區(qū)分大小寫,TEXT不區(qū)分大小寫

  • ENUM和SET類型是特殊的的串類型,其列值必須從固定的串集中選擇

ENUM只能選擇其中一個值,SET可以選擇多個值

日期和時間類數(shù)據(jù)列類型

數(shù)據(jù)類型 存儲空間 說明 取值范圍
DATE 3 字節(jié) “YYYY-MM-DD”格式表示的日期值 1000-01-01~9999-12-31
TIME 3 字節(jié) “hh:mm:ss”格式表示的時間值 -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”格式表示的時間戳 19700101000000-2037年的某個時刻
YEAR 1 字節(jié) “YYYY”格式的年份值 1901~2155
日期類型注意事項:
  • 存儲日期時,我們可以使用整型來進行存儲時間戳,這樣做便于我們進行日期的計算

NULL值

NULL值注意事項:
  • NULL意味著“沒有值”或“未知值”

  • 可以測試某個值是否為NULL

  • 不能對NULL值進行算術(shù)計算

  • 對NULL值進行算術(shù)運算,其結(jié)果還是NULL

  • 0或NULL都意味著假,其余值都意味著真

數(shù)據(jù)字段屬性

UNSIGNED

只能用于設(shè)置數(shù)值類型,不允許出現(xiàn)負(fù)數(shù)
最大存儲長度會增加一倍

ZEROFILL

只能用于設(shè)置數(shù)值類型,在數(shù)值之前會自動用0補齊不足的位數(shù)

AUTO_INCREMENT

用于設(shè)置字段的自動增長屬性,每增加一條記錄,該字段的值會自動加1

NULL和NOT NULL

默認(rèn)為NULL,即插入值時沒有在此字段插入值,默認(rèn)為NULL值,如果指定了NOT NULL,則必須在插入值時在此字段填入值

DEFAULT

可以通過此屬性來指定一個默認(rèn)值,如果沒有在此列添加值,那么默認(rèn)添加此值

創(chuàng)建索引

在MySQL中,主要有四類索引:

  • 主鍵索引(PRIMARY KEY)

主鍵索引是關(guān)系數(shù)據(jù)庫中最常見的索引類型,主要作用是確定數(shù)據(jù)表里一條特定的數(shù)據(jù)記錄的位置。我們可以在字段后添加PRIMARY KEY來對字段設(shè)置為主鍵索引。
注意:
1.最好為每張表指定一個主鍵,但不是必須指定。
2.一個表只能指定一個主鍵,而且主鍵的值不能為空
3.主鍵可以有多個候選索引(例如NOT NULL,AUTO_INCREMENT)

  • 唯一索引(UNIQUE)

唯一索引與主鍵索引一樣,都可以防止創(chuàng)建重復(fù)的值。但是,不同之處在于,每個數(shù)據(jù)表中只能有一個主鍵索引,但可以有多個唯一索引。我們使用關(guān)鍵字UNIQUE對字段定義為唯一索引。

  • 常規(guī)索引(INDEX)

常規(guī)索引技術(shù)是關(guān)系數(shù)據(jù)查詢中最重要的技術(shù),如果要提升數(shù)據(jù)庫的性能,索引優(yōu)化是首先應(yīng)該考慮的,因為它能使我們的數(shù)據(jù)庫得到最大性能方面的提升。常規(guī)索引也存在缺點:
1.多占用磁盤空間
2.會減慢插入,刪除和修改操作
3.需要按照索引列上排序格式執(zhí)行
創(chuàng)建索引我們可以使用INDEX和KEY關(guān)鍵字隨表一同創(chuàng)建。

  • 全文索引(FULLTEXT)

全文索引在MySQL中是一個FULLTEXT類型索引,但FULLTEXT索引只能用于MyISAM表,并且只可以在CHAR、VARCHAR或TEXT類型的列上創(chuàng)建,也允許創(chuàng)建在一個或多個數(shù)據(jù)列上。
但是FULLTEXT是不支持中文全文索引的,所以我們將來會使用效率更高的全文索引引擎Sphinx。

數(shù)據(jù)表的存儲類型及存儲位置

MySQL支持MyISAM、InnoDB、HEAP、BOB、ARCHIVE、CSV等多種數(shù)據(jù)表類型,在創(chuàng)建一個新MySQL數(shù)據(jù)表時,可以為它設(shè)置一個類型。

MyISAM和InnoDB兩種表類型最為重要:

1.MyISAM數(shù)據(jù)表類型的特點是成熟、穩(wěn)定和易于管理。
2.MyISAM表類型會產(chǎn)生碎片空間,要經(jīng)常使用OPTIMIZE TABLE命令去清理表空間
3.MyISAM不支持事務(wù)處理,InnoDB支持
4.MyISAM不支持外鍵,InnoDB支持
5.MyISAM表類型的數(shù)據(jù)表效率更高
6.MyISAM表類型的數(shù)據(jù)表會產(chǎn)生三個文件,InnoDB表類型表默認(rèn)只會產(chǎn)生一個文件。

字符集

創(chuàng)建表的時候,如果沒有明確地指定任何字符集,則新創(chuàng)建數(shù)據(jù)表的字符集將由MySQL配置文件里charcter-set-server選項的設(shè)置決定。

在創(chuàng)建數(shù)據(jù)表時如果需要指定默認(rèn)的字符集與之相同,但MySQL客戶程序在與服務(wù)器通信時使用的字符集,我們需要使用default-character-set選項或通過SQL命令SET NAMES utf8來指定一個字符集為utf8.

創(chuàng)建表

創(chuàng)建數(shù)據(jù)表之前,我們應(yīng)該注意:

1.創(chuàng)建數(shù)據(jù)庫(如已存在則不需要創(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ù)據(jù)類型 屬性 索引
用戶編號 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 ;

注意事項:

1.表的字段之間要使用逗號隔開。
2.建表的最后一句一定不能有逗號。
3.表名稱和字段名稱盡量不要使用MySQL系統(tǒng)的關(guān)鍵字
4.如果一定要使用關(guān)鍵字,我們可以使用反引號將表名稱和字段名稱包含起來來進行過濾屏蔽。
5.使用反引號會使建表效率增高。
6.數(shù)據(jù)表名稱和字段名稱不能重名
7.AUTO_INCREMENT屬性必須依附于主鍵索引或唯一索引

修改數(shù)據(jù)表

修改表的語法:

ALTER TABLE 表名 ACTION;

我們可以對表進行修改字段,添加字段,刪除字段,添加索引,刪除索引,更改表名稱,更改字段名稱,更改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;

這樣我們就會新增一個tname字段。

刪除字段:

我們使用drop關(guān)鍵字

ALTER TABLE `users` DROP `tname`;

這樣我們會刪除tname字段

添加索引:

我們使用add關(guān)鍵字

ALTER TABLE `uses` ADD INDEX/UNIQUE/PRIMARY KEY 索引名稱(字段名稱)

這樣會在該字段上建立索引(普通索引,唯一索引,主鍵索引)。

刪除索引:
ALTER TABLE `users` DROP INDEX/UNIQUE/PRIMARY KEY  索引名稱;

這樣我們會刪除這個索引,我們可以使用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] 表名稱;
  • 如何啟動和停止MySQL數(shù)據(jù)庫服務(wù)(至少兩種)?
  • 在命令行模式下如何連接MySQL數(shù)據(jù)庫服務(wù)。
  • 在mysql命令提示符下:如何查看當(dāng)前服務(wù)器下的數(shù)據(jù)庫(瀏覽數(shù)據(jù)庫);
  • 在mysql命令提示符下:如何選擇進入一個數(shù)據(jù)庫;
  • 在mysql命令提示符下:如何查看當(dāng)前庫下的所有表。
  • 在mysql命令提示符下:如何如何查看一個表格的結(jié)構(gòu);
  • 在mysql命令提示符下:如何取消當(dāng)前sql命令;
  • 在mysql命令提示符下:如何退出數(shù)據(jù)庫;
  • 在mysql命令提示符下:如何創(chuàng)建一個數(shù)據(jù)庫;
  • 在mysql命令提示符下:如何刪除一個數(shù)據(jù)庫;
  • 在mysql命令提示符下:如何刪除一個數(shù)據(jù)表;
  • 參考下面圖片,按照要求創(chuàng)建表格,(字段類型和約束只做參考)


    Paste_Image.png
  • 為上面的每個表都添加10條測試數(shù)據(jù)。
  • 修改其中的3條數(shù)據(jù)。
  • 刪除每個表的2條數(shù)據(jù)庫。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容