版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目3數(shù)據(jù)定義項(xiàng)目目標(biāo)掌握創(chuàng)建和管理數(shù)據(jù)庫(kù)的相關(guān)語(yǔ)句。掌握創(chuàng)建和管理數(shù)據(jù)表的相關(guān)語(yǔ)句。掌握數(shù)據(jù)完整性約束的作用。掌握創(chuàng)建數(shù)據(jù)完整性約束的方法。任務(wù)3.1創(chuàng)建和管理數(shù)據(jù)庫(kù)創(chuàng)建數(shù)據(jù)庫(kù)是數(shù)據(jù)庫(kù)實(shí)施階段的第一步,管理數(shù)據(jù)庫(kù)包括顯示數(shù)據(jù)庫(kù)、選擇數(shù)據(jù)庫(kù)、修改數(shù)據(jù)庫(kù)和刪除數(shù)據(jù)庫(kù)。3.1.1創(chuàng)建數(shù)據(jù)庫(kù)1.創(chuàng)建數(shù)據(jù)庫(kù)的語(yǔ)句格式CREATE{DATABASE|SCHEMA}[IFNOTEXISTS]數(shù)據(jù)庫(kù)名[[DEFAULT]CHARACTERSET字符集][[DEFAULT]COLLATE字符集的校對(duì)規(guī)則];(1)“{}”為必選項(xiàng);“[]”為可選項(xiàng);“|”分隔各個(gè)選項(xiàng),表示只能選擇其中一個(gè)。(2)IFNOTEXISTS:在創(chuàng)建數(shù)據(jù)庫(kù)前進(jìn)行判斷,只有在不存在該數(shù)據(jù)庫(kù)時(shí)才創(chuàng)建。(3)DEFAULT:指定數(shù)據(jù)庫(kù)的默認(rèn)字符集或校對(duì)規(guī)則。(4)CHARACTERSET子句:指定數(shù)據(jù)庫(kù)的字符集。(5)COLLATE子句:指定字符集的校對(duì)規(guī)則。(6)語(yǔ)句可以分行,以英文分號(hào)“;”結(jié)束。3.1.1創(chuàng)建數(shù)據(jù)庫(kù)2.MySQL數(shù)據(jù)庫(kù)中的字符集和校對(duì)規(guī)則字符集是一套符號(hào)和編碼,用于定義數(shù)據(jù)的存儲(chǔ)格式。例如,ASCII碼。校對(duì)規(guī)則是在字符集上用于比較字符大小的一套規(guī)則。例如,英文字符在比較大小時(shí)是否區(qū)分大小寫等。MySQLServer8.0支持的中文字符集GB2312,默認(rèn)的校對(duì)規(guī)則是GB2312_CHINESE_CI,。Maxlen列給出了不同字符集的字符存儲(chǔ)長(zhǎng)度。3.1.1創(chuàng)建數(shù)據(jù)庫(kù)【例3-1】創(chuàng)建一個(gè)名為librarydb的圖書館借還書管理數(shù)據(jù)庫(kù),采用MySQL數(shù)據(jù)庫(kù)默認(rèn)的字符集和校對(duì)規(guī)則。創(chuàng)建數(shù)據(jù)庫(kù)的語(yǔ)句格式:CREATE{DATABASE|SCHEMA}[IFNOTEXISTS]數(shù)據(jù)庫(kù)名[[DEFAULT]CHARACTERSET字符集][[DEFAULT]COLLATE字符集的校對(duì)規(guī)則];CREATEDATABASElibrarydb;mysql>CREATEDATABASElibrarydb;QueryOK,1rowaffected(0.01sec)創(chuàng)建數(shù)據(jù)庫(kù)舉例【例3-2】創(chuàng)建一個(gè)名為mytestdb的數(shù)據(jù)庫(kù),采用字符集GB2312和校對(duì)規(guī)則GB2312_CHINESE_CI。創(chuàng)建數(shù)據(jù)庫(kù)的語(yǔ)句格式:CREATE{DATABASE|SCHEMA}[IFNOTEXISTS]數(shù)據(jù)庫(kù)名[[DEFAULT]CHARACTERSET字符集][[DEFAULT]COLLATE字符集的校對(duì)規(guī)則];CREATEDATABASEmytestdb
CHARACTERSETGB2312COLLATEGB2312_CHINESE_CI;mysql>CREATEDATABASEmytestdb
->CHARACTERSETGB2312
->COLLATEGB2312_CHINESE_CI;QueryOK,1rowaffected(0.01sec)創(chuàng)建數(shù)據(jù)庫(kù)舉例【例3-3】如果不存在數(shù)據(jù)庫(kù)mytestdb,則創(chuàng)建該數(shù)據(jù)庫(kù)。創(chuàng)建數(shù)據(jù)庫(kù)的語(yǔ)句格式:CREATE{DATABASE|SCHEMA}[IFNOTEXISTS]數(shù)據(jù)庫(kù)名CREATEDATABASEIFNOTEXISTSmytestdb;mysql>CREATEDATABASEIFNOTEXISTSmytestdb;QueryOK,1rowaffected,1warning(0.01sec)mysql>SHOWWARNINGS;++++|Level|Code|Message|++++|Error|1007|Can'tcreatedatabase'mytestdb';databaseexists|++++3.1.2顯示數(shù)據(jù)庫(kù)顯示MySQL中的所有數(shù)據(jù)庫(kù)的語(yǔ)句格式:SHOWDATABASES;4個(gè)系統(tǒng)數(shù)據(jù)庫(kù)(1)information_schema:主要保存MySQL的系統(tǒng)信息。(2)mysql:主要存儲(chǔ)MySQL的用戶及其訪問權(quán)限等信息。(3)performance_schema:主要用于收集MySQL的性能數(shù)據(jù)。(4)sys:主要作用是展示MySQL的各類性能指標(biāo)。mysql>SHOWDATABASES;++|Database
|++|information_schema||librarydb
||mysql
||mytestdb
||performance_schema||sys
|++6rowsinset(0.00sec)3.1.3選擇數(shù)據(jù)庫(kù)在使用數(shù)據(jù)庫(kù)之前必須告訴MySQL要使用哪個(gè)數(shù)據(jù)庫(kù),使其成為當(dāng)前默認(rèn)的數(shù)據(jù)庫(kù)。選擇數(shù)據(jù)庫(kù)的語(yǔ)句格式:USE數(shù)據(jù)庫(kù)名;【例3-5】選擇數(shù)據(jù)庫(kù)librarydb作為當(dāng)前數(shù)據(jù)庫(kù)。
USElibrarydb;mysql>USElibrarydb;Databasechanged3.1.4修改數(shù)據(jù)庫(kù)修改數(shù)據(jù)庫(kù)的語(yǔ)句格式:ALTER{DATABASE|SCHEMA}[數(shù)據(jù)庫(kù)名][[DEFAULT]CHARACTERSET字符集][[DEFAULT]COLLATE字符集的校對(duì)規(guī)則];【例3-6】修改數(shù)據(jù)庫(kù)mytestdb的字符集為GBK,校對(duì)規(guī)則為GBK_CHINESE_CI。ALTERDATABASEmytestdbCHARACTERSETGBKCOLLATEGBK_CHINESE_CI;mysql>ALTERDATABASEmytestdb->CHARACTERSETGBK->COLLATEGBK_CHINESE_CI;QueryOK,1rowaffected(0.00sec)3.1.5刪除數(shù)據(jù)庫(kù)刪除數(shù)據(jù)庫(kù)的語(yǔ)句格式:DROP{DATABASE|SCHEMA}[IFEXISTS]數(shù)據(jù)庫(kù)名;【例3-7】刪除數(shù)據(jù)庫(kù)mytestdb。
DROPDATABASEIFEXISTSmytestdb;mysql>DROPDATABASEIFEXISTSmytestdb;QueryOK,0rowaffected(0.02sec)3.2創(chuàng)建和管理數(shù)據(jù)表數(shù)據(jù)表是數(shù)據(jù)庫(kù)中非常重要和基本的對(duì)象,是數(shù)據(jù)庫(kù)中組織和存儲(chǔ)數(shù)據(jù)的基本單位。在創(chuàng)建數(shù)據(jù)表前,需要先根據(jù)MySQL支持的數(shù)據(jù)類型設(shè)計(jì)數(shù)據(jù)表的結(jié)構(gòu)。3.2.1MySQL支持的數(shù)據(jù)類型MySQL支持的數(shù)據(jù)類型非常豐富,這里主要介紹常用的3種:1.數(shù)值型2.日期和時(shí)間型3.字符串型1.?dāng)?shù)值型數(shù)值型數(shù)據(jù)可以分為整數(shù)和實(shí)數(shù)兩類。整數(shù)主要有TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT這5種類型。其中,n表示整數(shù)的顯示位數(shù),在不指定n時(shí),數(shù)據(jù)按照默認(rèn)的顯示位數(shù)顯示。無論是否指定n,數(shù)據(jù)的取值范圍都不會(huì)發(fā)生改變。默認(rèn)情況下,整數(shù)都是有符號(hào)數(shù)。1.?dāng)?shù)值型實(shí)數(shù)主要有FLOAT(單精度浮點(diǎn)數(shù))DOUBLE(雙精度浮點(diǎn)數(shù))和DECIMAL(定點(diǎn)數(shù))這3種類型。其中,m表示顯示位數(shù),d表示小數(shù)位數(shù),并且“顯示位數(shù)m=整數(shù)位數(shù)+小數(shù)位數(shù)d”。在不指定m和d時(shí),數(shù)據(jù)默認(rèn)按照實(shí)際的精度(由計(jì)算機(jī)硬件和操作系統(tǒng)決定)顯示。定點(diǎn)數(shù)的優(yōu)點(diǎn)是不存在誤差,適合對(duì)精度要求極高的場(chǎng)景。2.日期和時(shí)間型日期和時(shí)間型數(shù)據(jù)主要有DATE、TIME、YEAR、DATETIME和TIMESTAMP這5種類型。不同類型表示的日期和時(shí)間內(nèi)容不同,取值范圍不同,而且存儲(chǔ)長(zhǎng)度也不同。3.字符串型有文本字符串和二進(jìn)制字符串兩種數(shù)據(jù)。文本字符串?dāng)?shù)據(jù)主要包括CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT這6種類型。其中,n表示可存儲(chǔ)字符的個(gè)數(shù),并且存儲(chǔ)時(shí)不區(qū)分中英文。CHAR在不指定n時(shí),默認(rèn)是CHAR(1)。VARCHAR必須指定n,如果實(shí)際字符數(shù)小于n,則按實(shí)際字符數(shù)存儲(chǔ)。3.字符串型二進(jìn)制字符串主要包括BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。其中,m表示可存儲(chǔ)的字節(jié)數(shù)。BINARY在不指定m時(shí),默認(rèn)占用1字節(jié)。VARBINARY必須指定m。m表示最多能存儲(chǔ)的字節(jié)數(shù),如果實(shí)際存儲(chǔ)的字節(jié)數(shù)小于m,則按實(shí)際字節(jié)數(shù)存儲(chǔ)。3.2.2設(shè)計(jì)數(shù)據(jù)表1.確定數(shù)據(jù)表的名稱2.設(shè)計(jì)數(shù)據(jù)表的結(jié)構(gòu)。確定數(shù)據(jù)表中各個(gè)字段的字段名稱、數(shù)據(jù)類型、是否允許空值、鍵和默認(rèn)值等。3.2.2設(shè)計(jì)數(shù)據(jù)表1.確定數(shù)據(jù)表的名稱2.設(shè)計(jì)數(shù)據(jù)表的結(jié)構(gòu)。確定數(shù)據(jù)表中各個(gè)字段的字段名稱、數(shù)據(jù)類型、是否允許空值、鍵和默認(rèn)值等。3.2.3創(chuàng)建數(shù)據(jù)表創(chuàng)建數(shù)據(jù)表的語(yǔ)句格式:CREATETABLE[IFNOTEXISTS]表名(字段名稱1數(shù)據(jù)類型[約束][,字段名稱2
數(shù)據(jù)類型[約束]…]);約束包括是否允許空值、默認(rèn)值、自增屬性、主鍵、唯一約束等,具體參數(shù)如下。[NULL|NOTNULL][DEFAULT默認(rèn)值][AUTO_INCREMENT][PRIMARYKEY][UNIQUE](1)NULL|NOTNULL:指定該字段是否允許空值。如果不指定,默認(rèn)允許空值。(2)DEFAULT默認(rèn)值:指定該字段的默認(rèn)值,默認(rèn)值必須是一個(gè)常量。如果不指定,默認(rèn)值為NULL。(3)AUTO_INCREMENT:指定該字段為自增字段,只能用于整數(shù)類型。每插入一條記錄,該字段的值自動(dòng)增加1,默認(rèn)從1開始。(4)PRIMARYKEY:指定該字段為主鍵。主鍵既不允許空值,也不允許重復(fù)。一張表只能指定一個(gè)主鍵。(5)UNIQUE:指定該字段為唯一約束。唯一約束允許空值,但不允許重復(fù)。一張表可以指定多個(gè)唯一約束。3.2.3創(chuàng)建數(shù)據(jù)表【例3-8】在數(shù)據(jù)庫(kù)librarydb中創(chuàng)建圖書表book,。USElibrarydb;CREATETABLEbook(book_idCHAR(6)NOTNULLPRIMARYKEY,
titleVARCHAR(50),
authorVARCHAR(50),
publisherVARCHAR(50),
pubdateDATE,
priceDECIMAL(7,2),
stocknumTINYINTDEFAULT1);3.2.3創(chuàng)建數(shù)據(jù)表【例3-8】在數(shù)據(jù)庫(kù)librarydb中創(chuàng)建圖書表book,。mysql>USElibrarydb;Databasechangedmysql>CREATETABLEbook->(->book_idCHAR(6)NOTNULLPRIMARYKEY,->titleVARCHAR(50),->authorVARCHAR(50),->publisherVARCHAR(50),->pubdateDATE,->priceDECIMAL(7,2),->stocknumTINYINTDEFAULT1->);QueryOK,0rowsaffected(0.01sec)3.2.3創(chuàng)建數(shù)據(jù)表【例3-9】創(chuàng)建圖書出版信息表pubinfo。
CREATETABLEpubinfo
(
book_idCHAR(6)PRIMARYKEY,
editorVARCHAR(50),
pagesINT,
abstractTEXT
);mysql>CREATETABLEpubinfo->(->book_idCHAR(6)PRIMARYKEY,->editorVARCHAR(50),->pagesINT,->abstractTEXT->);QueryOK,0rowsaffected(0.01sec)3.2.4查看數(shù)據(jù)表1.查看數(shù)據(jù)表的名稱2.查看數(shù)據(jù)表的基本結(jié)構(gòu)3.查看數(shù)據(jù)表的詳細(xì)結(jié)構(gòu)1.查看數(shù)據(jù)表的名稱SHOWTABLES[{FROM|IN}數(shù)據(jù)庫(kù)名];不指定數(shù)據(jù)庫(kù)名時(shí),默認(rèn)顯示當(dāng)前數(shù)據(jù)庫(kù)中數(shù)據(jù)表的名稱。【例3-10】在數(shù)據(jù)庫(kù)librarydb中查看已經(jīng)創(chuàng)建好的數(shù)據(jù)表的名稱。
SHOWTABLESFROMscoredb;或
SHOWTABLES;mysql>SHOWTABLES;++|Tables_in_librarydb|++|book
||pubinfo
|++2rowsinset(0.00sec)2.查看數(shù)據(jù)表的基本結(jié)構(gòu)SHOWCOLUMNS語(yǔ)句格式:SHOWCOLUMNS{FROM|IN}表名[{FROM|IN}數(shù)據(jù)庫(kù)名];DESCRIBE語(yǔ)句格式:{DESCRIBE|DESC}表名;【例3-11】查看圖書表book的基本結(jié)構(gòu)。SHOWCOLUMNSFROMbook;或DESCbook;
mysql>DESCbook;+++++++|Field
|Type
|Null|Key|Default|Extra|+++++++|book_id
|char(6)
|NO
|PRI|NULL|
||title
|varchar(50)|YES||NULL
|
||author
|varchar(50)
|YES||NULL
|
||publisher|varchar(50)
|YES||NULL
|
||pubdate
|date
|YES||NULL
|
||price
|decimal(7,2)|YES||NULL
|
||stocknum
|tinyint
|YES||1
|
|+++++++7rowsinset(0.01sec)3.查看數(shù)據(jù)表的詳細(xì)結(jié)構(gòu)SHOWCREATETABLE表名;【例3-12】查看圖書出版信息表pubinfo的詳細(xì)結(jié)構(gòu)。SHOWCREATETABLEpubinfo;mysql>SHOWCREATETABLEpubinfo;+++|Table
|CreateTable
|+++|pubinfo|CREATETABLE`pubinfo`(`book_id`char(6)NOTNULL,`editor`varchar(50)DEFAULTNULL,`pages`intDEFAULTNULL,`abstract`text,PRIMARYKEY(`book_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ci
|+++1rowinset(0.01sec)3.2.5修改數(shù)據(jù)表1.修改數(shù)據(jù)表的名稱2.修改字段的數(shù)據(jù)類型3.修改字段名稱和數(shù)據(jù)類型4.添加字段5.刪除字段1.修改數(shù)據(jù)表的名稱ALTERTABLE原表名RENAME[TO]新表名;【例3-13】將圖書出版信息表pubinfo的名稱修改為bookinfo。ALTERTABLEpubinfoRENAMEbookinfo;mysql>ALTERTABLEpubinfoRENAMEbookinfo;QueryOK,0rowsaffected(0.01sec)mysql>SHOWTABLES;++|Tables_in_librarydb|++|book||bookinfo|++2rowsinset(0.00sec)2.修改字段的數(shù)據(jù)類型ALTERTABLE表名MODIFY[COLUMN]字段名稱新的數(shù)據(jù)類型;【例3-14】將圖書出版信息表bookinfo中的內(nèi)容提要字段abstract的數(shù)據(jù)類型由TEXT修改為L(zhǎng)ONGTEXT。ALTERTABLEbookinfoMODIFYabstractLONGTEXT;mysql>DESCbookinfo;+++++++|Field|Type|Null|Key|Default|Extra|+++++++|book_id|char(6)|NO|PRI|NULL|||editor|varchar(50)|YES||NULL|||pages|int|YES||NULL|||abstract|longtext|YES||NULL||+++++++4rowsinset(0.00sec)3.修改字段名稱和數(shù)據(jù)類型ALTERTABLE表名CHANGE[COLUMN原字段名稱新字段名稱新數(shù)據(jù)類型;【例3-15】將圖書出版信息表bookinfo中的總頁(yè)數(shù)字段的名稱由pages修改為totalpages,數(shù)據(jù)類型由INT修改為TINYINT。
ALTERTABLEbookinfoCHANGEpagestotalpagesTINYINT;mysql>DESCbookinfo;+++++++|Field|Type|Null|Key|Default|Extra|+++++++|book_id|char(6)|NO|PRI|NULL|||editor|varchar(50)|YES||NULL|||totalpages|tinyint|YES||NULL|||abstract|longtext|YES||NULL||+++++++4.添加字段ALTERTABLE表名ADD[COLUMN]新字段名稱數(shù)據(jù)類型[約束條件][FIRST|AFTER已存在的字段名稱];【例3-16】在圖書出版信息表bookinfo中添加序號(hào)字段bid(作為數(shù)據(jù)表的第一個(gè)字段),數(shù)據(jù)類型為INT,約束為唯一約束且字段值自動(dòng)遞增。
ALTERTABLEbookinfoADDbidINTUNIQUEAUTO_INCREMENTFIRST;mysql>DESCbookinfo;+++++++|Field|Type|Null|Key|Default|Extra|+++++++|bid|int|NO|UNI|NULL|auto_increment||book_id|char(6)|NO|PRI|NULL|||editor|varchar(50)|YES||NULL|||totalpages|tinyint|YES||NULL|||abstract|longtext|YES||NULL||+++++++5rowsinset(0.00sec)5.刪除字段ALTERTABLE表名DROP字段名稱;【例3-17】將圖書出版信息表bookinfo中的序號(hào)字段bid刪除。
ALTERTABLEbookinfoDROPbid;3.2.6復(fù)制數(shù)據(jù)表1.復(fù)制數(shù)據(jù)表的結(jié)構(gòu)和數(shù)據(jù)CREATETABLE新表名SELECT*FROM原表名;
不會(huì)復(fù)制原表的主鍵設(shè)置,因此在新表中需要單獨(dú)設(shè)置主鍵?!纠?-18】將圖書出版信息表bookinfo的結(jié)構(gòu)和數(shù)據(jù)復(fù)制到新表newinfo1中。
CREATETABLEnewinfo1SELECT*FROMbookinfo;
mysql>DESCnewinfo1;+++++++|Field|Type|Null|Key|Default|Extra|+++++++|book_id|char(6)|NO||NULL|||editor|varchar(50)|YES||NULL|||totalpages|tinyint|YES||NULL|||abstract|longtext|YES||NULL||+++++++4rowsinset(0.00sec)3.2.6復(fù)制數(shù)據(jù)表2.復(fù)制數(shù)據(jù)表的結(jié)構(gòu)(含主鍵)CREATETABLE新表名LIKE原表名;【例3-19】將圖書出版信息表bookinfo的結(jié)構(gòu)完整地復(fù)制到新表newinfo2中。
CREATETABLEnewinfo2LIKEbookinfo;mysql>DESCnewinfo2;+++++++|Field|Type|Null|Key|Default|Extra|+++++++|book_id|char(6)|NO|PRI|NULL|||editor|varchar(50)|YES||NULL|||totalpages|tinyint|YES||NULL|||abstract|longtext|YES||NULL||+++++++4rowsinset(0.00sec)3.2.7刪除數(shù)據(jù)表DROPTABLE[IFEXISTS]表名1[,表名2…];【例3-20】將數(shù)據(jù)表newinfo1和newinfo2刪除。DROPTABLEnewinfo1,newinfo2;任務(wù)3.3數(shù)據(jù)完整性約束數(shù)據(jù)完整性指的是數(shù)據(jù)的一致性和準(zhǔn)確性。創(chuàng)建數(shù)據(jù)完整性約束后,MSQL負(fù)責(zé)檢查數(shù)據(jù)的完整性。在數(shù)據(jù)表中,只有符合完整性約束的數(shù)據(jù)才允許插入、刪除或修改。3.3.1認(rèn)識(shí)數(shù)據(jù)完整性(1)域完整性:數(shù)據(jù)表中各個(gè)字段的取值必須符合字段定義的數(shù)據(jù)類型。(2)實(shí)體完整性:數(shù)據(jù)表中的每一條記錄都必須是唯一的,即數(shù)據(jù)表的主鍵既不允許重復(fù)也不允許空值,因此組成主鍵的每一個(gè)字段的值都不允許為空值。(3)參照完整性:兩張相關(guān)聯(lián)的數(shù)據(jù)表的主鍵和外鍵字段的數(shù)據(jù)必須一致,即一張表中外鍵字段的值要么為空值,要么是另一張表的主鍵字段中已經(jīng)存在的值。(4)用戶定義完整性:數(shù)據(jù)表中的每一條記錄都必須滿足特定應(yīng)用場(chǎng)景對(duì)數(shù)據(jù)的要求。3.3.2主鍵約束1.在創(chuàng)建數(shù)據(jù)表時(shí)指定主鍵約束(1)在定義字段的同時(shí)指定單字段主鍵約束字段名稱數(shù)據(jù)類型PRIMARYKEY【例3-21】創(chuàng)建數(shù)據(jù)表book1(包含圖書編號(hào)book_id、書名title、作者author和出版社publisher字段),在定義book_id字段的同時(shí)指定其為主鍵約束。
CREATETABLEbook1(book_idCHAR(6)
PRIMARYKEY,
titleVARCHAR(50),
authorVARCHAR(50),
publisherVARCHAR(50));3.3.2主鍵約束(2)在定義完所有字段后指定單字段主鍵約束或多字段組合主鍵約束PRIMARYKEY(字段名稱1[,字段名稱2…])【例3-22】創(chuàng)建數(shù)據(jù)表book2(包含圖書編號(hào)book_id、書名title、作者author和出版社publisher字段),指定主鍵約束為book_id和title的組合。CREATETABLEbook2(book_idCHAR(6),
titleVARCHAR(50),
authorVARCHAR(50),
publisherVARCHAR(50)
,PRIMARYKEY(book_id,title));3.3.2主鍵約束2.在修改數(shù)據(jù)表時(shí)指定主鍵約束ALTERTABLE表名ADDPRIMARYKEY(字段名稱1[,字段名稱2…]);【例3-23】先忽略所有約束創(chuàng)建數(shù)據(jù)表book3(包含圖書編號(hào)book_id、書名title、作者author和出版社publisher字段),然后修改book3表指定主鍵約束為book_id。CREATETABLEbook3(book_idCHAR(6),
titleVARCHAR(50),
authorVARCHAR(50),
publisherVARCHAR(50));ALTERTABLEbook3ADDPRIMARYKEY(book_id);3.3.3唯一約束(1)一張數(shù)據(jù)表只能有一個(gè)主鍵約束,但可以有多個(gè)唯一約束。(2)主鍵約束不允許空值,唯一約束允許空值,但一個(gè)字段只能出現(xiàn)一個(gè)空值。3.3.3唯一約束1.在創(chuàng)建數(shù)據(jù)表時(shí)指定唯一約束(1)在定義字段的同時(shí)指定唯一約束
字段名稱數(shù)據(jù)類型UNIQUE【例3-24】創(chuàng)建數(shù)據(jù)表book4(包含圖書編號(hào)book_id、書名title、作者author和出版社publisher字段),在定義字段的同時(shí)指定book_id為主鍵約束,指定title為唯一約束。CREATETABLEbook4
(
book_idCHAR(6)PRIMARYKEY,
titleVARCHAR(50)UNIQUE,
authorVARCHAR(50),
publisherVARCHAR(50)
);3.3.3唯一約束(2)在定義完所有字段后指定唯一約束[CONSTRAINT約束名稱]UNIQUE(字段名稱1[,字段名稱2…])【例3-25】創(chuàng)建數(shù)據(jù)表book5(包含圖書編號(hào)book_id、書名title、作者author和出版社publisher字段),在定義完所有字段后指定book_id為主鍵約束,指定title和publisher的組合為唯一約束,以確保同一個(gè)出版社出版的圖書的書名不同,并且將唯一約束命名為constr1。CREATETABLEbook5
(
book_idCHAR(6),
titleVARCHAR(50),
authorVARCHAR(50),
publisherVARCHAR(50),
PRIMARYKEY(book_id),
CONSTRAINTconstr1UNIQUE(title,publisher)
);3.3.3唯一約束2.在修改數(shù)據(jù)表時(shí)指定唯一約束ALTERTABLE表名ADD[CONSTRAINT約束名稱]UNIQUE(字段名稱1[,字段名稱2]);
【例3-26】修改數(shù)據(jù)表book1,指定書名title和出版社publisher的組合為唯一約束。ALTERTABLEbook1ADDUNIQUE(title,publisher);3.3.4外鍵約束外鍵約束用于讓兩張相關(guān)聯(lián)的數(shù)據(jù)表的主鍵和外鍵字段的數(shù)據(jù)保持一致性,即參照完整性。當(dāng)插入、修改、刪除一張表中的數(shù)據(jù)時(shí),參照引用相關(guān)聯(lián)的另一張表中的數(shù)據(jù)來檢查對(duì)表中的數(shù)據(jù)操作是否正確。簡(jiǎn)單來說,就是要求子表(一對(duì)多聯(lián)系中的“多”端)中每一條記錄的外鍵字段值要么為空值,要么是父表(一對(duì)多聯(lián)系中的“一”端)中已經(jīng)存在的主鍵字段值。3.3.4外鍵約束在指定外鍵約束時(shí),需要滿足下列條件。(1)父表必須是已經(jīng)創(chuàng)建的數(shù)據(jù)表。(2)子表中外鍵字段的數(shù)據(jù)類型必須和父表中主鍵字段的數(shù)據(jù)類型相同。(3)父表和子表都必須使用InnoDB存儲(chǔ)引擎,且采用相同的字符集和校對(duì)規(guī)則。3.3.4外鍵約束1.在創(chuàng)建數(shù)據(jù)表(子表)時(shí)指定外鍵約束[CONSTRAINT約束名稱]FOREIGNKEY(子表字段名稱1[,子表字段名稱2…])REFERENCES父表名(父表字段名稱1[,父表字段名稱2…])[ONDELETE{RESTRICT|CASCADE|SETNULL|NOACTION|SETDEFAULT}][ONUPDATE{RESTRICT|CASCADE|SETNULL|NOACTION|SETDEFAULT}];(1)子表字段名稱:子表中需要指定外鍵約束的字段。(2)父表名:子表外鍵所依賴的數(shù)據(jù)表的名稱。(3)父表字段名稱:父表中定義的主鍵,可以是單字段主鍵或者多字段組合主鍵。(4)ONDELETE子句:為外鍵定義父表執(zhí)行DELETE(刪除)語(yǔ)句時(shí)的參照動(dòng)作。(5)ONUPDATE子句:為外鍵定義父表執(zhí)行UPDATE(修改)語(yǔ)句時(shí)的參照動(dòng)作。3.3.4外鍵約束[ONDELETE{RESTRICT|CASCADE|SETNULL|NOACTION|SETDEFAULT}][ONUPDATE{RESTRICT|CASCADE|SETNULL|NOACTION|SETDEFAULT}];不同的選項(xiàng)對(duì)應(yīng)的參照動(dòng)作如下。①RESTRICT:限制(默認(rèn)選項(xiàng))。當(dāng)刪除父表中的某條記錄時(shí),如果子表的外鍵字段中已經(jīng)存在該記錄的主鍵字段值,則不允許在父表中刪除該記錄。當(dāng)修改父表中的某條記錄的主鍵字段值時(shí),如果子表的外鍵字段中已經(jīng)存在該主鍵字段值,則不允許在父表中修改該主鍵字段值。②CASCADE:級(jí)聯(lián)。當(dāng)刪除父表中的某條記錄時(shí),如果子表的外鍵字段中已經(jīng)存在該記錄的主鍵字段值,將同時(shí)自動(dòng)刪除子表中與之對(duì)應(yīng)的記錄。當(dāng)修改父表中的某條記錄的主鍵字段值時(shí),如果子表的外鍵字段中已經(jīng)存在該主鍵字段值,將同時(shí)自動(dòng)修改子表中與之對(duì)應(yīng)的外鍵字段值為新值。③SETNULL:設(shè)置為空值。當(dāng)刪除父表中的某條記錄或修改父表中的某條記錄的主鍵字段值時(shí),如果子表的外鍵字段中已經(jīng)存在該記錄的主鍵字段值,將同時(shí)自動(dòng)設(shè)置子表中與之對(duì)應(yīng)的外鍵字段值為空值(在外鍵字段沒有指定為NOTNULL的條件下)。④NOACTION:不采取動(dòng)作。其作用和RESTRICT一樣。⑤SETDEFAULT:設(shè)置為默認(rèn)值。與SETNULL類似,區(qū)別在于將子表中與之對(duì)應(yīng)的外鍵字段值設(shè)置為默認(rèn)值。3.3.4外鍵約束【例3-27】創(chuàng)建館藏表stock,在定義所有字段后指定主鍵約束和外鍵約束。CREATETABLEstock
(stock_idCHAR(8),
book_idCHAR(6),
locationVARCHAR(50),
statusTINYINTNOTNULL,
PRIMARYKEY(stock_id),
FOREIGNKEY(book_id)REFERENCES
book(book_id)
);
命令語(yǔ)句中沒有指定外鍵的參照動(dòng)作,在默認(rèn)情況下遵循以下規(guī)則。(1)不能在子表的外鍵字段中輸入父表的主鍵字段中不存在的值。(2)如果子表中存在匹配的外鍵字段值,則不能從父表中刪除該主鍵字段值。(3)如果子表中存在匹配的外鍵字段值,則不能在父表中修改該主鍵字段值。3.3.4外鍵約束2.在修改數(shù)據(jù)表(子表)時(shí)指定外鍵約束ALTERTABLE表名ADD外鍵約束;【例3-28】創(chuàng)建數(shù)據(jù)表stock1,只指定主鍵約束館藏編號(hào)stock_id,然后在修改該數(shù)據(jù)表時(shí)指定外鍵約束。ALTERTABLEstock1ADDFOREIGNKEY(book_id)REFERENCESbook(book_id)ONDELETESETDEFAULTONUPDATECASCADE;CREATETABLEstock1(stock_idCHAR(8)PRIMARYKEY,
book_idCHAR(6),
locationVARCHAR(50),
statusTINYINT);命令語(yǔ)句定義了外鍵的兩個(gè)參照動(dòng)作。(1)ONDELETESETDEFAULT。如果在圖書表book中刪除了某種圖書,則stock1表中與該種圖書相關(guān)的所有圖書編號(hào)book_id字段值均自動(dòng)設(shè)置為默認(rèn)值。(2)ONUPDATECASCADE。如果在book表中修改了某種圖書的book_id字段值,則stock1表中與該種圖書相關(guān)的所有book_id字段值均自動(dòng)修改為新值。3.3.5檢查約束1.在創(chuàng)建數(shù)據(jù)表時(shí)指定檢查約束(1)在定義字段的同時(shí)指定檢查約束
字段名稱數(shù)據(jù)類型CHECK(表達(dá)式)【例3-29】創(chuàng)建數(shù)據(jù)表book6(包含圖書編號(hào)book_id、書名title、作者author、出版日期pubdate和館藏?cái)?shù)量stocknum字段),指定主鍵約束book_id,并在定義字段的同時(shí)指定檢查約束為“館藏?cái)?shù)量必須大于或等于0”。CREATETABLEbook6(book_idCHAR(6)PRIMARYKEY,
titleVARCHAR(50),
authorVARCHAR(50),
pubdateDATE,
stocknumTINYINTCHECK(stocknum>=0)
);3.3.5檢查約束(2)在定義完所有字段后指定檢查約束
[CONSTRAINT約束名稱]CHECK(表達(dá)式)【例3-30】創(chuàng)建數(shù)據(jù)表book7(包含圖書編號(hào)book_id、書名title、作者author、出版日期pubdate和館藏?cái)?shù)量stocknum字段),指定主鍵約束book_id,并在定義完所有字段后指定檢查約束為“館藏?cái)?shù)量必須大于或等于0,出版日期為2000年1月1日及以后”。CREATETABLEbook7(book_idCHAR(6)PRIMARYKEY,
titleVARCHAR(50),
authorVARCHAR(50),
pubdateDATE,
stocknumTINYINT,
CHECK(stocknum>=0),
CHECK(pubdate>='2000-01-01')
);3.3.5檢查約束2.在修改數(shù)據(jù)表時(shí)指定檢查約束ALTERTABLE表名ADDCHECK(表達(dá)式);【例3-31】針對(duì)前面已經(jīng)創(chuàng)建的數(shù)據(jù)表book6,指定檢查約束為“出版日期為2000年1月1日及以后”。ALTERTABLEbook6ADDCHECK(pubdate>='2000-01-01');3.3.6非空約束1.在創(chuàng)建數(shù)據(jù)表時(shí)指定非空約束
字段名稱數(shù)據(jù)類型NOTNULL【例3-32】創(chuàng)建數(shù)據(jù)表book8(包含圖書編號(hào)book_id、書名title、作者author和館藏?cái)?shù)量stocknum字段),指定主鍵約束book_id,非空約束為“title字段的值不能為空值”。CREATETABLEbook8(book_idCHAR(6)PRIMARYKEY,
titleVARCHAR(50)NOTNULL,
authorVARCHAR(50),
stocknumTINYINT);3.3.6非空約束2.在修改數(shù)據(jù)表時(shí)指定非空約束ALTERTABLE表名MODIFY[COLUMN]字段名稱數(shù)據(jù)類型NOTNULL;【例3-33】修改數(shù)據(jù)表book8,指定非空約束為“author字段的值不能為空值”。ALTERTABLEbook8MODIFYauthorVARCHAR(50)NOTNULL;3.3.7默認(rèn)值約束1.在創(chuàng)建數(shù)據(jù)表時(shí)指定默認(rèn)值約束字段名稱數(shù)據(jù)類型DEFAULT默認(rèn)值【例3-34】創(chuàng)建數(shù)據(jù)表book9(包含圖書編號(hào)book_id、書名title、作者author和館藏?cái)?shù)量stocknum字段),指定主鍵約束book_id,指定stocknum的默認(rèn)值約束為1。CREATETABLEbook9(book_idCHAR(6)PRIMARYKEY,
titleVARCHAR(50),
authorVARCHAR(50),
stocknumTINYINTDEFAULT1);3.3.7默認(rèn)值約束2.在修改數(shù)據(jù)表時(shí)指定默認(rèn)值約束ALTERTABLE表名MODIFY[COLUMN]字段名稱數(shù)據(jù)類型DEFAULT默認(rèn)值;【例3-35】修改數(shù)據(jù)表book8,指定館藏?cái)?shù)量stocknum的默認(rèn)值約束為1。ALTERTABLEbook8MODIFYstocknumTINYINTDEFAULT1;3.3.8刪除數(shù)據(jù)完整性約束刪除不同的數(shù)據(jù)完整性約束的語(yǔ)法格式。(1)刪除主鍵約束:ALTERTABLE表名DROPPRIMARYKEY。(2)刪除外鍵約束:ALTERTABLE表名DROPFOREIGNKEY約束名稱。(3)刪除唯一約束:ALTERTABLE表名DROPUNIQUE約束名稱。(4)刪除檢查約束:ALTERTABLE表名DROPCHECK約束名稱。使用SHOWCREATETABLE語(yǔ)句查看并確定具體的約束名稱。非空約束和默認(rèn)值約束只能修改,不能刪除。3.3.8刪除數(shù)據(jù)完整性約束【例3-36】針對(duì)已經(jīng)創(chuàng)建好的數(shù)據(jù)表book7,刪除其中的檢查約束。。(1)確定約束名稱SHOWCREATETABLEbook7;++-+|Table
|CreateTable
|++-+|book7
|CREATETABLE`book7`(`book_id`char(6)NOTNULL,`title`varchar(50)DEFAULTNULL,`author`varchar(50)DEFAULTNULL,`pubdate`dateDEFAULTNULL,`stocknum`tinyintDEFAULTNULL,PRIMARYKEY(`book_id`),CONSTRAINT`book7_chk_1`CHECK((`stocknum`>=0)),CONSTRAINT`book7_chk_2`CHECK((`pubdate`>=_gbk'2000-01-01')))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ci
|+++3.3.8刪除數(shù)據(jù)完整性約束【例3-36】針對(duì)已經(jīng)創(chuàng)建好的數(shù)據(jù)表book7,刪除其中的檢查約束。(1)確定約束名稱SHOWCREATETABLEbook7;(2)刪除檢查約束book7_chk_1
ALTERTABLEbook7DROPCHECKbook7_chk_1;項(xiàng)目案例:圖書館借還書管理數(shù)據(jù)庫(kù)的數(shù)據(jù)定義1.設(shè)計(jì)數(shù)據(jù)表2.創(chuàng)建數(shù)據(jù)庫(kù)3.創(chuàng)建數(shù)據(jù)表4.指定數(shù)據(jù)完整性約束圖書館借還書管理數(shù)據(jù)庫(kù)一共包含5個(gè)關(guān)系模式,每一個(gè)關(guān)系模式對(duì)應(yīng)一張數(shù)據(jù)表(圖書表、館藏表、讀者類型表、讀者表和借還書表),前面已經(jīng)介紹了圖書表book和館藏表stock。1.設(shè)計(jì)數(shù)據(jù)表(1)設(shè)計(jì)readertype表readertype表的關(guān)系模式為讀者類型表(類型編號(hào),類型名稱,最大借閱數(shù)量,最大借閱天數(shù))。1.設(shè)計(jì)數(shù)據(jù)表(2)設(shè)計(jì)reader表reader表的關(guān)系模式為讀者表(讀者編號(hào),類型編號(hào),姓名,性別,所屬院系)。1.設(shè)計(jì)數(shù)據(jù)表(3)設(shè)計(jì)borrow表borrow表的關(guān)系模式為借還書表(借閱記錄編號(hào)、讀者編號(hào)、館藏編號(hào)、借出時(shí)間、歸還時(shí)間)。2.創(chuàng)建數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)名為librarydb的圖書館借還書管理數(shù)據(jù)庫(kù),采用MySQL默認(rèn)的字符集和校對(duì)規(guī)則,并使其成為當(dāng)前數(shù)據(jù)庫(kù)。如果前面已經(jīng)創(chuàng)建同名數(shù)據(jù)庫(kù),先使用DROPDATABASE語(yǔ)句刪除該數(shù)據(jù)庫(kù)后再創(chuàng)建。DROPDATABASEIFEXISTSlibrarydb;CREATEDATABASElibrarydb;3.創(chuàng)建數(shù)據(jù)表(1)創(chuàng)建book表,要求同時(shí)指定主鍵約束和默認(rèn)值約束。CREATETABLEbook(book_idCHAR(6)PRIMARYKEY,
titleVARCHAR(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 增值稅培訓(xùn)課件下載
- 醫(yī)保年度工作總結(jié)(3篇)
- 2026年湖州職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)及參考答案詳解1套
- 2026年成都職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)及參考答案詳解1套
- 助理值班員培訓(xùn)課件
- 2026年銅川職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)及參考答案詳解
- 2026年閩西職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)考試題庫(kù)及參考答案詳解一套
- 2026年沙洲職業(yè)工學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)及參考答案詳解1套
- 公交公司站務(wù)員培訓(xùn)課件
- 2026年晉城職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試題庫(kù)含答案詳解
- 三年級(jí)數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)附答案集錦
- 會(huì)計(jì)博士面試題庫(kù)及答案
- 美容整形手術(shù)知情同意書模板
- 國(guó)際物流學(xué)習(xí)心得體會(huì)范文
- 25秋國(guó)家開放大學(xué)《理工英語(yǔ)1》形考任務(wù)參考答案
- 微震監(jiān)測(cè)技術(shù)在深埋隧道圍巖脆性破壞研究中的應(yīng)用
- 三年級(jí)語(yǔ)文下冊(cè)期末復(fù)習(xí)測(cè)試卷
- 鹽巴的營(yíng)銷方案
- 2025年中國(guó)玄武巖纖維制品行業(yè)市場(chǎng)分析及投資價(jià)值評(píng)估前景預(yù)測(cè)報(bào)告
- 鋼結(jié)構(gòu)廠房水電安裝施工組織方案
- 2025年天水村文書考試題及答案
評(píng)論
0/150
提交評(píng)論