濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > MySQL 設(shè)計(jì)和命令行模式下建立詳解

MySQL 設(shè)計(jì)和命令行模式下建立詳解

熱門(mén)標(biāo)簽:沈陽(yáng)智能外呼系統(tǒng)供應(yīng)商 清遠(yuǎn)申請(qǐng)400電話 地圖簡(jiǎn)圖標(biāo)注 谷歌地圖標(biāo)注位置圖解 東莞外呼企業(yè)管理系統(tǒng) 桂林云電銷(xiāo)機(jī)器人收費(fèi) 南通電銷(xiāo)外呼系統(tǒng)哪家強(qiáng) 手機(jī)外呼系統(tǒng)違法嗎 如何選擇優(yōu)質(zhì)的外呼系統(tǒng)

MySQL 設(shè)計(jì)和命令行模式下建立詳解

系列文章:

MySQL 設(shè)計(jì)和命令行模式下建立詳解

C++利用MySQL API連接和操作數(shù)據(jù)庫(kù)實(shí)例詳解

1.數(shù)據(jù)表的設(shè)計(jì)

MySQL數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)中,包含的MySQL中定義數(shù)據(jù)字段的類(lèi)型對(duì)你數(shù)據(jù)庫(kù)的優(yōu)化是非常重要的。MySQL支持多種類(lèi)型,大致可以分為三類(lèi):數(shù)值、日期/時(shí)間和字符串(字符)類(lèi)型。

下面以大學(xué)熟悉的學(xué)生選課管理系統(tǒng)中用到的數(shù)據(jù)庫(kù)為例,來(lái)設(shè)計(jì)相應(yīng)的數(shù)據(jù)表。主要有三張表:學(xué)生表,課程表和選課表。

學(xué)生表設(shè)計(jì):

字段(Field) 類(lèi)型(Type) 可空(Null) 鍵(Key) 默認(rèn)值(Default) 其他(Extra)
學(xué)號(hào)(studentNo) VARCHAR(12) N PRI NULL
姓名(name) VARCHAR(12) N N NULL
學(xué)院(school) VARCHAR(12) N N NULL
年級(jí)(grade) VARCHAR(12) N N NULL
專(zhuān)業(yè)(major) VARCHAR(12) N N NULL
性別(gender) Boolean N N NULL

課程表設(shè)計(jì):

字段(Field) 類(lèi)型(Type) 可空(Null) 鍵(Key) 默認(rèn)值(Default) 其他(Extra)
課程號(hào)(courseNo) VARCHAR(10) N PRI NULL
課程名(courseName) VARCHAR(10) N N NULL
課時(shí)(hour) TINYINT Unsigned N N NULL
課程學(xué)分(credit) TINYINT Unsigned N N 2

選課表設(shè)計(jì):

字段(Field) 類(lèi)型(Type) 可空(Null) 鍵(Key) 默認(rèn)值(Default) 其他(Extra)
編號(hào)(id) INT Unsigned N PRI NULL auto_increment
學(xué)號(hào)(studentNo) VARCHAR(12) N MUL NULL
課程號(hào)(courseNo) VARCHAR(10) N MUL NULL
選課時(shí)間(time) TIMESTAMP N N CURRENT_TIMESTAMP

對(duì)于上面三張數(shù)據(jù)表的設(shè)計(jì),你會(huì)發(fā)現(xiàn):

(1)MySQL在為數(shù)據(jù)定義字符串(字符)類(lèi)型時(shí),需要在類(lèi)型名稱(chēng)的后面的小括號(hào)內(nèi)指明最長(zhǎng)字符數(shù),即TypeName(M),這里的M指的是字符數(shù),而不是數(shù)據(jù)占用的字節(jié)數(shù)。例如varchar(12),則表述存儲(chǔ)的字符數(shù)不能超過(guò)12 ,超過(guò)12則截?cái)?,小?2個(gè)字符則以實(shí)際占用的存儲(chǔ)空間來(lái)存儲(chǔ),這樣就節(jié)省了存儲(chǔ)空間。

(2)在對(duì)選課表的設(shè)計(jì)時(shí),我們添加外鍵約束,可以使得兩張表關(guān)聯(lián),保證數(shù)據(jù)的一致性和實(shí)現(xiàn)一些級(jí)聯(lián)操作。

(3)MySQL中有三種Key和一個(gè)Index: Primary Key(主鍵), Unique Key(唯一鍵),Foreign Key(外鍵)和 Index(索引)。

四者的區(qū)別如下:

定義:

主鍵(Primary Key):唯一標(biāo)識(shí)一條記錄,不能有重復(fù),不允許為空。
外鍵(Foreign Key):表的外鍵是另一表的主鍵, 外鍵可以有重復(fù), 可以是空值。
唯一鍵( Unique Key):唯一標(biāo)識(shí)一條記錄,不能有重復(fù),可以為空。
索引(Index):該字段可以有重復(fù)值記錄,可以有空值,如果是唯一索引,那么就不可以有重復(fù)的記錄,可以有空值。

作用:

主鍵:用來(lái)保證數(shù)據(jù)完整性。
外鍵:用來(lái)和其他表建立聯(lián)系,以保證數(shù)據(jù)的一致性和級(jí)聯(lián)操作。
唯一鍵:用來(lái)用防止數(shù)據(jù)插入的時(shí)候重復(fù)。
索引:是提高查詢(xún)排序的速度。

個(gè)數(shù):

主鍵:一個(gè)表只能有一個(gè)列是主鍵。
外鍵:一個(gè)表可以有多個(gè)列是外鍵。
唯一鍵:一個(gè)表可以有多個(gè)列是唯一鍵。
索引:一個(gè)表可以有多個(gè)列是索引。

從中可以看出,索引和唯一鍵很相似,二者的區(qū)別在于作用不同,索引用于提高查詢(xún)速度,唯一鍵用于唯一約束。當(dāng)然如果建立的索引是唯一索引的話,也可以起到唯一約束的作用。在MySQL具體實(shí)現(xiàn)上,索引需要建立數(shù)據(jù)結(jié)構(gòu),需要額外的磁盤(pán)空間來(lái)存儲(chǔ)索引,而鍵(主鍵,外鍵和唯一鍵)都是邏輯層面的實(shí)現(xiàn)和約束,二者還是有著本質(zhì)的區(qū)別。

還有就是MySQL的索引包括:普通索引(Index)、唯一索引(UNIQUE INDEX)、全文索引(FULLTEXT INDEX)、組合索引。這里就不要把唯一鍵和唯一索引弄混淆了!也不要把索引和其它的三種鍵弄混淆了。

還有一點(diǎn)需要注意的是,雖然鍵(key)和索引(index)有著本質(zhì)的區(qū)別,但是當(dāng)我們?cè)诮⒅麈I或者唯一鍵的時(shí)候,也就建立了索引,MySQL和Oracle都是這么做的,要是不明白這一點(diǎn),很容易把索引和主鍵和唯一鍵弄混淆。

唯一鍵可以起到唯一約束的作用,當(dāng)然主鍵也可以起到唯一約束的作用。當(dāng)然我們可以不建立唯一鍵和主鍵,直接為指定的數(shù)據(jù)表的列添加唯一約束。唯一約束保證指定列的值不能重復(fù)。

所以,關(guān)于上面的概念,大家不要咬文嚼字,而是根據(jù)功能去理解每一種KEY的作用,在什么場(chǎng)合需要去使用它。

比如需要主鍵約束的時(shí)候,我們就可以對(duì)某一列建立主鍵;

需要對(duì)某一列或者多個(gè)列進(jìn)行唯一約束的時(shí)候,我們就建立唯一鍵或者唯一約束;
需要加快查詢(xún)速度的時(shí)候,我們就建立相應(yīng)類(lèi)型的索引。

關(guān)于四者的理解,上未參考到權(quán)威的資料,請(qǐng)讀者保持懷疑的態(tài)度接受。

2.數(shù)據(jù)庫(kù)的建立

在安裝完mysql之后,我們要建立自己的數(shù)據(jù)庫(kù)。下面將詳細(xì)地一步一步演示如何創(chuàng)建上面設(shè)計(jì)好的數(shù)據(jù)庫(kù)。
在MySQL模式下,使用status命令可以查看MySQL版本,本人使用的MySQL版本:5.6.30 MySQL Community Server (GPL)。

關(guān)于mysql大小寫(xiě)問(wèn)題,mysql命令是不區(qū)分大小寫(xiě)的。數(shù)據(jù)表的表名在windows下不分,linux下分。數(shù)據(jù)表的字段名在windows和linux下都不分。

(1)登錄mysql DBMS

Linux命令行中輸入如下命令:

mysql -hlocalhost -uroot -p123456

說(shuō)明:依次指明登錄mysql的主機(jī)地址,用戶(hù)和用戶(hù)密碼。

(2)使用show查看當(dāng)前mysql服務(wù)器上存在什么數(shù)據(jù)庫(kù)

show databases;

說(shuō)明:在進(jìn)入mysql模式下,使用mysql命令時(shí),每條語(yǔ)句要以分號(hào)結(jié)束。但是use [DatabaseName]卻不用,可能是mysql的一個(gè)小bug。類(lèi)似于quit和exit退出mysql的命令,不需要一個(gè)分號(hào)。(如果你喜歡,你可以用一個(gè)分號(hào)終止這樣的語(yǔ)句)。

(3)創(chuàng)建數(shù)據(jù)庫(kù)

mysql> CREATE DATABASE StudentCourse;

(4)使用use語(yǔ)句訪問(wèn)數(shù)據(jù)庫(kù)

mysql>use StudentCourse;

(5)創(chuàng)建數(shù)據(jù)表student

mysql> create table student(
 studentNo varchar(12) not null,
 name varchar(12) not null,
 school varchar(12) not null,
 grade varchar(12) not null,
 major varchar(12) not null,
 gender boolean not null,
 primary key(studentNo)
)engine=MyISAM default charset=utf8;

觀察上面的建表語(yǔ)句,需注意以下幾點(diǎn):

(a)其中,布爾類(lèi)型boolean在MySQL是以類(lèi)型tinyint(1)來(lái)實(shí)現(xiàn),這里的1指代的是數(shù)據(jù)顯示時(shí)最短長(zhǎng)度。
實(shí)際上tinyint(1)是可以插入-128到127之間的其它數(shù)值。因?yàn)閙ysql數(shù)據(jù)庫(kù)中以 :數(shù)據(jù)類(lèi)型(m)來(lái)定義數(shù)據(jù)類(lèi)型,其中 數(shù)字m在不同的數(shù)據(jù)類(lèi)型中表示含義是不同的。 整型數(shù)系統(tǒng)已經(jīng)限制了取值范圍,tinyint占一個(gè)字節(jié)、int占4個(gè)字節(jié)。所以整型數(shù)后面的m不是表示的數(shù)據(jù)長(zhǎng)度,而是表示數(shù)據(jù)在顯示時(shí)顯示的最小長(zhǎng)度(長(zhǎng)度為字符數(shù))。

tinyint(1) 這里的1表示的是最短顯示一個(gè)字符。tinyint(2) 這里的2表示的是最短顯示兩個(gè)字符,但這里光設(shè)置m是沒(méi)有意義的,你還需要指定當(dāng)數(shù)據(jù)少于長(zhǎng)度m時(shí)用什么來(lái)填充,比如zerofill(表示有0填充)。設(shè)置tinyint(2) zerofill你插入1時(shí)他會(huì)顯示01。設(shè)置tinyint(4) zerofill你插1時(shí)他會(huì)顯示0001。

(b)還要注意一點(diǎn)是,使用engine可指明引擎,如果省略了engine語(yǔ)句,則使用默認(rèn)的引擎(MYISAM)。MYSQL支持三個(gè)引擎:ISAM、MYISAM和HEAP。另外兩種類(lèi)型INNODB和BERKLEY(BDB),也常??梢允褂?。

(c)設(shè)置default charset指明mysql數(shù)據(jù)表的編碼方式,不顯示指定編碼方式的話,數(shù)據(jù)表的默認(rèn)編碼方式一般是latin1。也可以通過(guò)如下命令查看數(shù)據(jù)表的編碼方式:

show create table student;

如果需要轉(zhuǎn)換數(shù)據(jù)表的編碼格式,使用如下命令:

alter table student convert to character set utf8;

如果想查看當(dāng)前數(shù)據(jù)庫(kù)的編碼格式:

mysql>status;
#或者
show variables like 'character%' ;

為了驗(yàn)證所建立的數(shù)據(jù)表是否是按照期望的方式創(chuàng)建的,使用如下命令:

#查看表中的列
SHOW COLUMNS FROM student;
#或者直接使用describe
describe student;

(6)創(chuàng)建數(shù)據(jù)表course

mysql> create table course(
 studentNo varchar(12) not null primary key,
 courseNo varchar(10) not null,
 hour tinyint unsigned not null,
 credit tinyint unsigned not null default 2 
)engine=MYISAM default charset=utf8;

同樣可以使用describe查看表信息:

(7)創(chuàng)建數(shù)據(jù)表courseSelection

mysql> create table courseSelection(
 id int unsigned not null auto_increment primary key,
 studentNo varchar(12) not null,
 courseNo varchar(10) not null,
 time timestamp not null default CURRENT_TIMESTAMP,
 FOREIGN KEY(studentNo) REFERENCES student(ISBN) ON UPDATE CASCADE ON DELETE CASCADE,
 FOREIGN KEY(courseNo) REFERENCES course(courseNo) ON UPDATE CASCADE ON DELETE CASCADE
)engine=MYISAM default charset=utf8 AUTO_INCREMENT=0;

查看表信息:

(8)其它關(guān)于數(shù)據(jù)庫(kù)和數(shù)據(jù)表的操作命令

刪除數(shù)據(jù)庫(kù):

mysql> DROP DATABASE 庫(kù)名;

刪除數(shù)據(jù)表:

mysql> DROP TABLE 表名;

將表中記錄清空:

mysql> DELETE FROM 表名;

參考文獻(xiàn):

[1]http://www.runoob.com/mysql/mysql-data-types.html
[2]Mysql 查看、創(chuàng)建、更改 數(shù)據(jù)庫(kù)和表
[3]php里tinyint(1)為什么還能插入99這個(gè)值?搜索
[4]MySQL引擎
[5]MySQL中的四種Key
[6]SQL的主鍵和外鍵約束
[7]唯一索引和唯一約束有什么區(qū)別

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

您可能感興趣的文章:
  • PHP+MySQL投票系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)分享
  • PHP+Mysql樹(shù)型結(jié)構(gòu)(無(wú)限分類(lèi))數(shù)據(jù)庫(kù)設(shè)計(jì)的2種方式實(shí)例
  • MYSQL 數(shù)據(jù)庫(kù)命名與設(shè)計(jì)規(guī)范
  • mysql 數(shù)據(jù)庫(kù)設(shè)計(jì)
  • MySQL分表實(shí)現(xiàn)上百萬(wàn)上千萬(wàn)記錄分布存儲(chǔ)的批量查詢(xún)?cè)O(shè)計(jì)模式詳解
  • MySQL 數(shù)據(jù)庫(kù)設(shè)計(jì)復(fù)習(xí)筆記及項(xiàng)目實(shí)戰(zhàn)
  • 基于PHP+MySQL的聊天室設(shè)計(jì)
  • MySQL和MongoDB設(shè)計(jì)實(shí)例對(duì)比分析
  • 如何設(shè)計(jì)高效合理的MySQL查詢(xún)語(yǔ)句

標(biāo)簽:貴州 臨沂 內(nèi)蒙古 成都 湖州 天津 重慶 常德

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL 設(shè)計(jì)和命令行模式下建立詳解》,本文關(guān)鍵詞  MySQL,設(shè)計(jì),和,命令行,模式,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL 設(shè)計(jì)和命令行模式下建立詳解》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于MySQL 設(shè)計(jì)和命令行模式下建立詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    岳阳市| 江阴市| 陈巴尔虎旗| 施秉县| 镇原县| 和硕县| 游戏| 伊通| 佛山市| 泰安市| 贺兰县| 上虞市| 韩城市| 繁昌县| 泽州县| 怀化市| 云阳县| 阿克苏市| 通榆县| 洮南市| 汪清县| 六安市| 南通市| 微山县| 陆良县| 剑川县| 遵义市| 嘉鱼县| 东至县| 克拉玛依市| 汽车| 三台县| 岱山县| 临夏县| 连平县| 杭锦后旗| 道孚县| 邮箱| 溧阳市| 赣州市| 内黄县|