MySQL教程(新體系-綜合應用實例視頻)(第4版) 課件 第5、6章 表記錄操作;分區(qū)、表空間和行格式_第1頁
MySQL教程(新體系-綜合應用實例視頻)(第4版) 課件 第5、6章 表記錄操作;分區(qū)、表空間和行格式_第2頁
MySQL教程(新體系-綜合應用實例視頻)(第4版) 課件 第5、6章 表記錄操作;分區(qū)、表空間和行格式_第3頁
MySQL教程(新體系-綜合應用實例視頻)(第4版) 課件 第5、6章 表記錄操作;分區(qū)、表空間和行格式_第4頁
MySQL教程(新體系-綜合應用實例視頻)(第4版) 課件 第5、6章 表記錄操作;分區(qū)、表空間和行格式_第5頁
已閱讀5頁,還剩150頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

第5章

表記錄操作——插入記錄MySQL+實用教程(第4版)01插入新記錄1.單記錄插入2.含豐富類型user表記錄插入3.多記錄插入4.關于UUID和timestamp處理插入新記錄(1)值插入對應的列,值可以是表達式,“值”是表達式的值。省略(列名,...),則為所有列,順序同表結(jié)構(gòu)一致。INSERTINTO表名[(列名,...)]VALUES(值,...)(2)值直接插入指定的列,比值順序?qū)许樞蚋庇^。INSERTINTO表名 SET列名=值,...;(3)對JSON列記錄的插入語句。INSERTINTO表名(JSON列名)VALUES(JSON對象值);其中的JSON對象值既可以以JSON_OBJECT函數(shù)構(gòu)造,也可以直接以JSON格式字符串的形式給出。(4)對空間字段記錄的插入語句。INSERTINTO表名(空間列名)VALUES(空間對象值);插入新記錄1.單記錄插入創(chuàng)建表,包含自增、默認值、非空及日期時間等多種屬性和類型的列,然后插入記錄?!纠?.1】插入訂單記錄。1)由訂單表(orders)創(chuàng)建表訂單新表(orders_new)。USEemarket;CREATETABLEorders_newLIKEorders;ALTERTABLEorders_newADD姓名char(4)AFTER帳戶名;DESCorders_new;運行結(jié)果如圖5.1所示。插入新記錄2)向訂單新表(orders_new)插入記錄。SETSESSIONsql_mode=''; #在當前會話中關閉嚴格模式INSERTINTOorders_new VALUES(null,'','易

斯',default,NOW()); #(a)INSERTINTOorders_new(帳戶名,姓名,支付金額,下單時間) VALUES('23168-',NULL,'108a',NOW()); #(b)INSERTINTOorders_new(訂單編號,帳戶名,姓名,下單時間) VALUES(100,'','周俊鄰',CURDATE()); #(c)說明:(a)因為省略列名表,在VALUES子句中需要根據(jù)表結(jié)構(gòu)中列的先后順序(訂單編號,帳戶名,姓名,支付金額,下單時間)依次給出與每個列對應的值。訂單編號為NULL對應AUTO_INCREMENT自增值,支付金額采用默認值需要default占位,下單時間對應NOW()系統(tǒng)函數(shù)為當前時間。(b)指定列名表,對應VALUES子句中值的順序也要相對應,其中姓名為空。支付金額列給出了字符串值'108a',系統(tǒng)能自動去掉尾隨的非數(shù)字文本a,插入其余的數(shù)字部分值并轉(zhuǎn)為定點數(shù)108.00。如果字符串中沒有前導數(shù)字部分,則將該列設置為0。(c)訂單編號列直接填100,不取自增值。下單時間列以CURDATE函數(shù)給出了當前日期(缺少時間部分),實際插入的值就以相應格式的“零”值填充時間部分。沒有列出的支付金額取默認值0。插入新記錄3)繼續(xù)執(zhí)行下列語句。INSERTINTOorders_new SET姓名='周俊鄰',帳戶名='',支付金額=15,

下單時間=CURDATE();SELECT*FROMorders_new;顯示orders_new表記錄如圖5.2所示。插入新記錄2.含豐富類型user表記錄插入上面關注的是INSERT語句本身,這里關注用INSERT語句中各種數(shù)據(jù)類型列插入記錄的情況。下面通過實例說明?!纠?.2】含豐富類型user表記錄插入。1)顯示user表結(jié)構(gòu)。USEemarket;DESCuser;顯示user表結(jié)構(gòu)如圖5.3所示。插入新記錄用戶表(user)樣本記錄如表5.1所示。帳戶名密碼姓名性別手機號身份證號有效期常用地址職業(yè)******易斯男1355181376X32010219601112321#2099.12.30

教師231668-******周俊鄰男1391385645X32040419700801062#2028.06.02

職工******孫函錦女1890156273X50023119891203203#2029.12.19

職工2)插入user表記錄。顯示user表記錄如圖5.4所示。插入新記錄說明:(a)枚舉類型“性別”和“職業(yè)”列采用成員字符串('男','教師')描述;集合類型“關注”列采用成員字符串('水果')描述;JSON類型“常用地址”列采用JSON_OBJECT("地址",JSON_OBJECT(...))嵌套結(jié)構(gòu)。因為常用地址JSON列除了地址項,還可能包含收件人和收件人電話等內(nèi)容,而地址項內(nèi)容本身也需要用JSON描述;這里的空間類型投遞位置數(shù)據(jù)通過“網(wǎng)絡經(jīng)緯度查找網(wǎng)站”根據(jù)常用地址查找得到對應數(shù)據(jù)。(b)性別列和密碼列內(nèi)容采用表結(jié)構(gòu)定義時的該列對應的默認值(DEFAULT)。性別列定義時默認值為'男',密碼列定義時默認值'abc123'?!奥殬I(yè)”列采用編號描述,表結(jié)構(gòu)職業(yè)列定義如下,所以編號2對應枚舉值'職工'。職業(yè) enum('學生','職工','教師','醫(yī)生','軍人','公務員','其他')“關注”列內(nèi)容采用成員編號5描述,表結(jié)構(gòu)關注列定義如下:關注 set('水果','肉禽','海鮮水產(chǎn)','糧油蛋')十進制5對應二進制第1項和第3項(101),故關注內(nèi)容對應為'海鮮水產(chǎn)'和'水果'?!俺S玫刂贰敝抵苯硬捎肑SON字符串'{"地址":{...},...}'描述。(c)枚舉類型“性別”列以編號2(對應性別為女)指定,集合類型“關注”列采用多成員('水果,肉禽,海鮮水產(chǎn),糧油蛋')字符串描述。插入新記錄3.多記錄插入用一條SQL語句完成多條記錄插入:INSERTINTO表名(列表) VALUES(值,...),...;要求所有值表(值,...)都與列表有完全相同的順序。如果全字段插入,則可省略列表,只須依次列出各個值表即可?!纠?.3】對商品表commodity分兩批插入多條記錄。(1)顯示商品表commodity列結(jié)構(gòu)。USEemarket;DESCcommodity;顯示結(jié)果如圖5.5所示。插入新記錄(2)列表的方式插入多條記錄。DELETEFROMcommodity;INSERTINTOcommodity(商品編號,商品名稱,價格,庫存量) VALUES ('1A0101','洛川紅富士蘋果冰糖心10斤箱裝',44.80,3601), ('1A0201','煙臺紅富士蘋果10斤箱裝',29.80,5698), ('1A0302','阿克蘇蘋果冰糖心5斤箱裝',29.80,12680);(3)省略列表的方式插入多條記錄。INSERTINTOcommodity VALUES ('1B0501','庫爾勒香梨10斤箱裝',69.80,8902,null,default,default), ('1B0601','碭山梨10斤箱裝大果',19.90,14532,null,default,default), ('1B0602','碭山梨5斤箱裝特大果',16.90,6834,null,default,default);SELECT*FROMcommodity;插入新記錄說明:因為省略列表的方式,在VALUES子句后面需要給出所有列的值。但最后2列(總價和商品)為虛擬列,寫null值不正確,不寫對應的值列值個數(shù)又不對,均無法完成,只能用default占位。運行結(jié)果如圖5.6所示。插入新記錄4.關于UUID和timestamp處理在一個表中,若沒有合適的區(qū)分記錄唯一性的字段,一般選擇int類型作為主鍵,加上AUTO_INCREMENT屬性,大多數(shù)情況下還是可靠的。但可能無法適應數(shù)據(jù)分片的擴容(分庫分表)。如今MySQL8對UUID提供了增強性支持,不僅使其長度大大縮小,而且解決了原來存在的UUID值無序的問題。(1)UUID():可以生成不會重復出現(xiàn)的32位16進制字符串(不算分隔符'-'),例如:62ab1547-710f-11e8-9a58-5254007205d6采用utf8mb4編碼直接保存32個字符需要占用128個字節(jié),對于主鍵來說還是太長。但UUID中的每個字符都是16進制字符,兩個16進制字符占用一個字節(jié),這樣可以輕松將UUID轉(zhuǎn)換為binary(16),占用16個字節(jié),所需空間大大減少,而且二進制字符串檢索比對效率很高。(2)UUID_TO_BIN(參數(shù)1,參數(shù)2):將UUID轉(zhuǎn)化為16位二進制字符串,參數(shù)1為UUID字符串,如果參數(shù)2為true則將UUID中的timestamp部分中的time-low(第一段字符)和time-high(第三段字符)調(diào)換,這樣產(chǎn)生的UUID是順序遞增的。(3)BIN_TO_UUID(參數(shù)1,參數(shù)2):將16位二進制字符串轉(zhuǎn)化為可讀的UUID,參數(shù)1為16位二進制字符串,如果參數(shù)2省略或為false,即將二進制字符串原位轉(zhuǎn)換;如果參數(shù)2為true,則將原來調(diào)換的time-low和time-high再調(diào)換回去,返回原本的UUID。插入新記錄【例5.4】測試UUID和timestamp。1)創(chuàng)建一張測試表。USEmydb;DROPTABLEIFEXISTStest;CREATETABLEtest( ID1 varbinary(16)PRIMARYKEY, ID2 timestampDEFAULTCURRENT_TIMESTAMP());2)使用函數(shù)UUID_TO_BIN插入3條記錄。INSERTINTOtest(ID1)VALUES(UUID_TO_BIN(UUID(),true));INSERTINTOtest(ID1)VALUES(UUID_TO_BIN(UUID(),true));INSERTINTOtest(ID1)VALUES(UUID_TO_BIN(UUID(),true));插入新記錄3)查看插入記錄結(jié)果。SELECTID1,BIN_TO_UUID(ID1,true)ID1HEXFROMtest;運行結(jié)果如圖5.7所示。其中,ID1列的內(nèi)容是二進制,所以直接輸出顯示就是亂碼。如果需要按主鍵查詢,還是需要使用對應的UUID函數(shù):SELECT*FROMtest WHEREID1=UUID_TO_BIN('1cc17038-1fdf-11eb-80af-107b44954a26',true);運行結(jié)果第1條記錄被查詢顯示。02插入查詢記錄1.將記錄加入到另一個表2.通過ONDUPLICATEKEYUPDATE子句來避免插入沖突插入查詢記錄如果將已經(jīng)存在表記錄插入到指定的表中,使用下列語句。INSERTINTO目標表名(列名,...) SELECT(輸出項,...)FROM源表名[WHERE條件] [ONDUPLICATEKEYUPDATE列名=值,...];其中,SELECT查詢得到記錄插入到INTO指定的目標表中。包含ONDUPLICATEKEYUPDATE,當插入的記錄行在目標表的主鍵(PRIMARYKEY)或惟一索引列(UNIQUE)中已經(jīng)存在是,用新行更新已有行。插入查詢記錄1.將記錄加入到另一個表【例5.5】把訂單新表(orders_new)包含支付金額的記錄加入到訂單表(orders)中。USEemarket;SELECT*FROMorders_new; #(a)DELETEFROMorders;INSERTINTOorders(訂單編號,帳戶名,支付金額,下單時間) SELECT訂單編號,帳戶名,支付金額,下單時間FROMorders_newWHERE支付金額>0;SELECT*FROMorders; #(b)運行結(jié)果如圖5.8所示。插入查詢記錄2.通過ONDUPLICATEKEYUPDATE子句來避免插入沖突【例5.6】把新訂單表(orders_new)包含支付金額的記錄加入到訂單表(orders)中,相同記錄更新指定列。(1)修改新訂單表(orders_new)表中訂單編號為100和101記錄的支付金額USEemarket;UPDATEorders_newSET支付金額=26.30WHERE訂單編號=100;UPDATEorders_newSET支付金額=150WHERE訂單編號=101;(2)執(zhí)行插入語句INSERTINTOorders(訂單編號,帳戶名,支付金額,下單時間) SELECT訂單編號,帳戶名,支付金額,下單時間FROMorders_newWHERE支付金額>0 ONDUPLICATEKEYUPDATE支付金額=orders_new.支付金額;SELECT*FROMorders;運行結(jié)果如圖5.9所示。03導入文件數(shù)據(jù)1.導入文本數(shù)據(jù)2.導入XML數(shù)據(jù)導入文件數(shù)據(jù)1.導入文本數(shù)據(jù)MySQL的LOADDATA語句能以非??斓乃俣葘⑽谋疚募械臄?shù)據(jù)導入到表中:LOADDATA[LOCAL]INFILE文件名INTOTABLE表名 #(a) FIELDS... #(b) LINES... #(c)說明一:(a)“文件名”用單引號括起來,文件以普通文本文件(.txt)格式保存。(b)指定導入數(shù)據(jù)時對字段格式及屬性的具體要求。(c)指定導入數(shù)據(jù)時對文本文件中行格式及屬性的具體要求?!纠?.7】LOADDATA語句將從emarket數(shù)據(jù)庫目錄中讀取文件commodity.txt,將文件內(nèi)容加載到商品表commodity中。commodity.txt內(nèi)容如圖5.10所示。導入文件數(shù)據(jù)(1)客戶端本地導入文件。為使本例能正常操作,需要將local_infile這個系統(tǒng)全局環(huán)境變量設置為ON,執(zhí)行如下語句,然后查看設置結(jié)果:SETGLOBALlocal_infile=ON;(2)將文件commodity.txt內(nèi)容加載到商品表。USEemarket;LOADDATALOCALINFILE'E:\MySQL8\\DATAFILE\\commodity.txt'INTOTABLEcommodity CHARACTERSETgbk #(a) FIELDS TERMINATEDBY',' #(b) ENCLOSEDBY'\"' #(c) ESCAPEDBY'\'' #(d) LINES TERMINATEDBY'\r\n'; #(e)導入文件數(shù)據(jù)說明:(a)CHARACTERSET為MySQL從文件導入數(shù)據(jù)指定字符集。由于本例文本中含有漢字字符,為了正確地解釋文件內(nèi)容,這里將字符集設為gbk。注意:E:\MySQL8\DATAFILE目錄中分隔符“\”需要變成“\\”。(b)設置字段之間的分隔字符(單個或多個),默認為制表符(“\t”),本例文本文件中數(shù)據(jù)字段間是以逗號分隔的,故這里設為“,”。(c)設置包圍(引用)字段的字符,只能是單個字符,本例文本文件中以雙引號引用字段內(nèi)容,故設為“\"”。(d)控制如何寫入或讀取特殊字符,即設置轉(zhuǎn)義字符。(e)用于設置文本文件中每行的結(jié)束符,可以為單個或多個字符,本例為回車換行符“\r\n”。導入文件數(shù)據(jù)2.導入XML數(shù)據(jù)MySQL的LOADXML語句能將外部XML文件中定義的數(shù)據(jù)導入到表中。LOADXML[LOCAL]INFILE文件名INTOTABLE表名 #(a) ROWSIDENTIFIEDBY'<標記名>' #(b) [(@變量1,...)] #(c) [SET列名1=@變量1,...]; #(c)說明:(a)“文件名”同樣用單引號括起來,要寫出完整后綴(.xml)。同樣也可以指定LOCAL關鍵字由客戶機上的程序讀取XML文件發(fā)送給服務器,服務器定位文件的規(guī)則同LOADDATA語句。(b)據(jù)此檢索和導入所有與該名稱匹配的標記內(nèi)的數(shù)據(jù)內(nèi)容作為表記錄。(c)導入數(shù)據(jù)時,MySQL服務器默認查找XML<標記名>中與數(shù)據(jù)庫表的列名相匹配的字段名。導入文件數(shù)據(jù)2)XML數(shù)據(jù)格式要導入XML文件數(shù)據(jù),XML文件中的內(nèi)容首先需要按照XML格式組織編寫:<?xmlversion="1.0"encoding="UTF-8"?><data>

內(nèi)容描述</data>其中,內(nèi)容描述的數(shù)據(jù)可以是下列3種基本格式:(1)字段名作為屬性,字段值作為屬性值。(2)直接將字段名作為標記,字段值就是標記的內(nèi)容。(3)字段名作為<field>標記的name屬性,值是這些標記的內(nèi)容。導入文件數(shù)據(jù)【例5.8】將XML文件(emarket.xml)商品數(shù)據(jù)內(nèi)容導入商品表和供應商表中。1)在本地E:\MySQL8\DATAFILE目錄下emarket.xml內(nèi)容。其中,包含了4條商品表(commodity)和11條供貨商表(supplier)記錄。MySQL通過這種機制,就可以實現(xiàn)用同一個XML文件存儲不同應用的多個方面的數(shù)據(jù),在需要時再通過標記名區(qū)分需要導入數(shù)據(jù),增強靈活性的同時又避免了數(shù)據(jù)冗余。供貨商表(supplier)結(jié)構(gòu)如圖5.11所示。導入文件數(shù)據(jù)2)將XML包含<commodity>標記的數(shù)據(jù)導入commodity表。SETGLOBALlocal_infile=ON;USEemarket;LOADXMLLOCALINFILE'E:\MySQL8\\DATAFILE\\emarket.xml'INTOTABLEcommodity CHARACTERSETgbk #(a) ROWSIDENTIFIEDBY'<commodity>' #(b) (@cid,@cname,@price,@amount) #(c) SET商品編號=@cid,商品名稱=@cname,價格=@price,庫存量=@amount; #(c)SELECT*FROMcommodityWHERELEFT(商品編號,1)>='3';運行結(jié)果如圖5.12所示。說明:(a)指定文件內(nèi)容字符集為gbk。(b)指定文件中采用<commodity>作為行記錄標記。(c)設置變量名與字段名對應,然后通過SET把字段名與表列名對應。導入文件數(shù)據(jù)3)將XML包含<supplier>標記的數(shù)據(jù)導入供應商(supplier)表中。SETGLOBALlocal_infile=ON;LOADXMLLOCALINFILE'E:\MySQL8\\DATAFILE\\emarket.xml' INTOTABLEsupplier CHARACTERSETgbk ROWSIDENTIFIEDBY'<supplier>' (@sid,@sname) SET供貨商編號=@sid,供貨商名稱=@sname;SELECT*FROMsupplier;運行結(jié)果如圖5.13所示。04導入Excel/Word文件數(shù)據(jù)導入Excel/Word文件數(shù)據(jù)實際應用中,有的表(部分)數(shù)據(jù)已經(jīng)產(chǎn)生在Excel表中,而MySQL沒有直接導入它們的命令,這時候可以用Navicat進行操作。Excel文件內(nèi)容如圖5.14所示,Word訂單項表內(nèi)容如圖5.15所示。05導入圖片數(shù)據(jù)導入圖片數(shù)據(jù)對商品表的第一條記錄導入圖片數(shù)據(jù),由于要執(zhí)行INSERT語句,這里先將第一條記錄刪除,再連同圖片數(shù)據(jù)一起執(zhí)行插入操作:DELETEFROMcommodityWHERE商品編號='1A0101';INSERTINTOcommodity(商品編號,商品名稱,價格,庫存量,商品圖片) VALUES ('1A0101','洛川紅富士蘋果冰糖心10斤箱裝',44.80,3601,LOAD_FILE('E:/MySQL8/DATAFILE/apple.jpg'));SELECT商品編號,商品圖片F(xiàn)ROMcommodityWHERE商品編號='1A0101';運行結(jié)果如圖5.16所示。導入圖片數(shù)據(jù)說明:(1)這里插入的圖片文件大小不能超過64KB。(2)雖然在my.ini文件中指定了圖片文件的存放路徑,但這里的LOAD_FILE('E:/MySQL8/DATAFILE/apple.jpg')仍然需要指定當前導入的文件的路徑。用同樣的方法可為其他商品導入圖片數(shù)據(jù)。(3)如果導入圖片不能成功,可以查看系統(tǒng)配置文件my.ini:[mysqld]......#圖片存放路徑secure_file_priv=...執(zhí)行下列語句:SHOWGLOBALVARIABLESLIKE'%secure%';可以查看secure_file_priv系統(tǒng)變量值。修改成:secure_file_priv=或者對應圖片文件路徑,重新啟動MySQL再試。06查詢表記錄復制1.新表列為已有表的部分或者全部2.用Navicat復制表結(jié)構(gòu)和數(shù)據(jù)3.創(chuàng)建表結(jié)構(gòu)列同時移植已有表的部分列查詢表記錄復制1.新表列為已有表的部分或者全部下列語句可對已有表查詢記錄并將表結(jié)構(gòu)在內(nèi)復制到另一個表中。CREATETABLE表名AS(SELECT語句)【例5.9】在emarket數(shù)據(jù)庫中,復制一個commodity表結(jié)構(gòu)和內(nèi)容。CREATETABLEcommodity_copy3 AS(SELECT*FROMcommodityWHERE商品編號LIKE'1%');DESCcommodity; #(a)DESCcommodity_copy3; #(b)SELECT*FROMcommodity_copy3; #(c)查詢表記錄復制運行結(jié)果如圖5.17所示。

查詢表記錄復制2.用Navicat復制表結(jié)構(gòu)和數(shù)據(jù)在實際數(shù)據(jù)庫應用開發(fā)時,復制表結(jié)構(gòu)和數(shù)據(jù)記錄可以直接在Navicat環(huán)境下可視化操作十分方便。具體方法如下:選擇需要復制的表,按右鍵,在快捷菜單中選擇“復制表”→“結(jié)構(gòu)和數(shù)據(jù)”,系統(tǒng)生成一個新表,表結(jié)構(gòu)(包括主鍵、索引、約束、外鍵、分區(qū)等)和記錄與原表相同,但新表名在老表名后面加了“_copy1”。3.創(chuàng)建表結(jié)構(gòu)列同時移植已有表的部分列創(chuàng)建表結(jié)構(gòu)部分列與已有表部分列合在一起,使用下列語句。CREATETABLE表名(

列名,...)SELECT語句查詢表記錄復制【例5.10】創(chuàng)建commodity_copy4表,僅需要commodity表商品編號、商品名稱和價格列。USEemarket;CREATETABLEcommodity_copy4(

商品ID int NOTNULLAUTO_INCREMENTPRIMARYKEY)SELECT商品編號,商品名稱,價格FROMcommodity;SELECT*FROMcommodity_copy4;commodity_copy4表記錄如圖5.18所示。第5章

表記錄操作——修改記錄01替換記錄1.插入或者替換記錄2.默認值的影響替換記錄用REPLACE語句實現(xiàn)記錄替換操作,有三種格式。REPLACEINTO表名[(列表)]VALUES(值,...)REPLACEINTO表名 SET列名=值,...REPLACEINTO目標表名(列表1) SELECT(列表2)FROM源表名[WHERE條件]REPLACE替換記錄的語法與插入(INSERT)記錄的語法類同,它們的功能差別是:(1)INSERT只能實現(xiàn)插入記錄,如果插入的記錄的主鍵內(nèi)容在表中存在,語句就會出錯。(2)REPLACE加入的內(nèi)容在表中不存在就插入記錄。如果插入的內(nèi)容主鍵在表中存在,它就會先刪除原來的這個記錄,然后插入記錄。在不確定表中是否已存在與所要插的記錄主鍵相同的記錄時,用REPLACE語句執(zhí)行替換操作,可避免因INSERT語句無法插入重復主鍵而出錯,通常在需要給數(shù)據(jù)庫中已有記錄補充錄入新數(shù)據(jù)的場合非常有用,不需要人為查找和刪除原有的重復記錄。替換記錄1.插入或者替換記錄【例5.11】用REPLACE語句向與commodity表結(jié)構(gòu)相同的新表commodity_new中插入記錄。USEemarket;CREATETABLEcommodity_newLIKEcommodity; #(a)REPLACEINTOcommodity_new(商品編號,商品名稱,價格,庫存量)SELECT商品編號,商品名稱,價格,庫存量FROMcommodityWHERELEFT(商品編號,1)<='2'; #(b)REPLACEINTOcommodity_new(商品編號,商品名稱,價格,庫存量) VALUES('1GA101','智利車厘子2斤大櫻桃整箱順豐包郵',80.00,6000); #(c)REPLACEINTOcommodity_new(商品編號,商品名稱,價格,庫存量) VALUES('1GA101','智利車厘子2斤大櫻桃整箱順豐包郵',59.80,5420); #(d)SELECT*FROMcommodity_new;運行結(jié)果如圖5.19所示。替換記錄說明:(a)創(chuàng)建新表commodity_new,表結(jié)構(gòu)與commodity表結(jié)構(gòu)(包含生成列)相同。(b)復制commodity表符合LEFT(商品編號,1)<='2'條件的記錄到commodity_new表中。(c)插入一條商品編號為'1GA101'的記錄。(d)修改一條商品編號為'1GA101'記錄中的價格和庫存量列數(shù)據(jù)。語句影響的記錄如圖5.20所示。替換記錄說明:(1)REPLACEINTOcommodity_new...SELECT語句從commodity表選取符合要求的記錄向commodity_new表插入,影響了9條記錄。(2)REPLACEINTOcommodity_new...VALUES('1GA101',...80.00,6000)語句直接插入1條記錄。(3)REPLACEINTOcommodity_new...VALUES('1GA101',...59.80,5420)語句替換了1條記錄,影響了2條記錄(先刪除1條記錄,然后插入1條記錄)。(4)SELECT*FROMcommodity_new語句沒有影響任何記錄。替換記錄2.默認值的影響【例5.12】修改commodity_new表記錄。1)對編號為“2A1602”的記錄修改其商品名稱。USEemarket; REPLACEINTOcommodity_new SET商品編號='2A1602',商品名稱='冷凍五花肉';出錯提示信息如圖5.21所示。說明:創(chuàng)建表的時候“價格”列未指定默認值,REPLACE語句替換時強制用戶對沒有默認值的字段賦值,否則無法執(zhí)行。但如果設置為非嚴格模式:SETSQL_MODE='';替換記錄2)將上面語句改寫。REPLACEINTOcommodity_new SET商品編號='2A1602',商品名稱='冷凍五花肉',價格=118;SELECT*FROMcommodity_newWHERE商品編號='2A1602';運行結(jié)果如圖5.22所示??梢钥吹剑幪枴?A1602”的“商品名稱”已經(jīng)改成了新內(nèi)容,由于SET子句并未指定庫存量,故MySQL取其默認值0。替換記錄3)基于默認值運算。REPLACEINTOcommodity_new SET商品編號='2A1602',商品名稱='冷凍五花肉',價格=價格*0.8,庫存量=庫存量+10;SELECT*FROMcommodity_newWHERE商品編號='2A1602';運行結(jié)果如圖5.23所示。說明:REPLACE語句不能從原記錄行引用值并在新記錄行中使用它們,MySQL其實是在列默認值(或隱式默認值)的基礎上執(zhí)行運算的,簡言之,如果使用“SET列名=列名+10”這樣的賦值,相當于“SET列名=DEFAULT(列名)+10”,本例“庫存量”默認值是0,故運算后為10;而“價格”列未定義默認值,MySQL取其隱式默認值0.00,乘以0.8運算后仍然為0.00。02替換記錄1.單表更新2.多表更新3.圖片列更新更新記錄1.單表更新這是UPDATE語句最常用的方式,基本語法格式為:UPDATE表名SET列名=值... #(a) [WHERE條件] #(b) [ORDERBY...] #(c) [LIMIT行數(shù)] #(d)說明:(a)UPDATE語句使用新值更新指定表中現(xiàn)有行的列,SET子句指示要更新的列以及對應的新值,可以將每個新值作為表達式或關鍵字DEFAULT(默認值)給出。(b)如果指定了WHERE子句,則指定標識要更新行的條件;如果沒有WHERE子句,則更新表中所有行。(c)如果指定了ORDERBY子句,則按指定的順序更新行。(d)LIMIT子句限制可更新的行數(shù)。更新記錄1)更新符合條件記錄【例5.13】更新commodity_new表的記錄。USEemarket;UPDATEcommodity_new SET價格=118,庫存量=120 WHERE商品編號='2A1602';SELECT*FROMcommodity_newWHERE商品編號='2A1602'; #(a)UPDATEcommodity_new SET價格=價格*0.8,庫存量=庫存量+10 WHERE商品編號='2A1602';SELECT*FROMcommodity_newWHERE商品編號='2A1602'; #(b)運行結(jié)果如圖5.24所示。更新記錄2)順序更新記錄【例5.14】更新commodity_new表商品的價格。所有商品先降10%,庫存量最大的2個商品再降5%。USEemarket;SELECT商品編號,商品名稱,價格,庫存量FROMcommodity_newORDERBY庫存量DESC; #(a)UPDATEcommodity_newSET價格=價格-價格*0.1;UPDATEcommodity_newSET價格=價格*0.95 ORDERBY庫存量DESCLIMIT2;SELECT商品編號,價格,庫存量FROMcommodity_newORDERBY庫存量DESC; #(b)更新記錄運行結(jié)果如圖5.25所示。

說明:(a)commodity_new表價格更新前數(shù)據(jù)。(b)commodity_new表價格更新后數(shù)據(jù):商品編號='1B0601':價格=19.90*0.9*0.95=17.0145=17.01。商品編號='1A0302':價格=29.80*0.9*0.95=25.479=25.48。其他商品(例如商品編號='1B0501)的價格=69.80*0.9=62.82。更新記錄2.多表更新多表更新即是關聯(lián)多個表,用本表或者其他表列的數(shù)據(jù)共同更新指定列。UPDATE表名1,表名2,... SET表名1.列名=表名2.列名, ...... WHERE多表關聯(lián)條件;1)把查詢結(jié)果作為表進行更新【例5.15】將commodity_new表中與commodity表價格差小于15,且原commodity表價格高于100的商品價格減10元。USEemarket;SELECT商品編號,價格FROMcommodityWHERE商品編號<'3'; #(a)SELECT商品編號,價格FROMcommodity_new; #(b)UPDATEcommodity_new,(SELECT商品編號,價格AS原價FROMcommodityWHERE商品編號<'3'AND價格>=100)AScommodity_temp SETcommodity_new.價格=commodity_new.價格-10 WHEREcommodity_temp.原價-commodity_new.價格<15ANDcommodity_new.商品編號=commodity_temp.商品編號;SELECT商品編號,價格FROMcommodity_new; #(c)更新記錄運行結(jié)果如圖5.26所示。

說明:(a)顯示commodity表商品編號<'3'記錄,因為commodity_new表僅僅包含商品編號<'3'的記錄。(b)顯示commodity_new表所有記錄。(c)執(zhí)行更新以后的commodity_new表所有記錄,僅有1條記錄更新。更新記錄2)多表記錄同步【例5.16】將commodity_new表記錄數(shù)據(jù)同步到與commodity表的數(shù)據(jù)一致。USEemarket;UPDATEcommodity_new,commodity SETcommodity_new.商品名稱=commodity.商品名稱, commodity_new.價格=commodity.價格, commodity_new.庫存量=commodity.庫存量 WHEREcommodity_new.商品編號=commodity.商品編號;SELECT*FROMcommodity_new;更新記錄執(zhí)行后commodity_new表與commodity表商品編號相同的記錄,數(shù)據(jù)就又恢復為與commodity表的一樣了,但commodity表中沒有的記錄(1GA1011),commodity_new表仍然保持原來內(nèi)容,運行結(jié)果如圖5.27所示。在commodity表中增加商品編號='1GA1011'的記錄,價格=59.80,庫存量=5420。INSERTINTOcommodity(商品編號,商品名稱,價格,庫存量) VALUES('1GA1011','智利車厘子2斤大櫻桃整箱順豐包郵',59.80,5420);更新記錄3.圖片列更新如果表包含圖片列,實際情況下圖片列記錄更新是需要的。例如,對于商品表,如果銷售的商品重新變化,更新對應的圖片就是自然的。使用下列語句可以進行圖片更新:UPDATE表名SET列名=LOAD_FILE('路徑/圖片文件名')在執(zhí)行更新前先要將系統(tǒng)配置文件my.ini中的變量置空:#圖片存放路徑secure_file_priv=更新記錄【例5.17】更新commodity表商品圖片內(nèi)容。USEemarket;UPDATEcommodity SET商品圖片=LOAD_FILE('E:/MySQL8/DATAFILE/apple1.jpg') WHERE商品編號='1A0201';SELECT商品編號,商品圖片F(xiàn)ROMcommodityWHERE商品編號='1A0201';顯示結(jié)果如圖5.28所示。如下語句將已經(jīng)存在的圖片列清空:UPDATEcommodity SET商品圖片=NULL WHERE條件;在Navicate中,選擇對應的圖片列,右鍵單擊快捷菜單“設置為NULL”項也可清空當前記錄圖片列內(nèi)容。03JSON類型列記錄修改JSON類型列記錄修改MySQL8.0的優(yōu)化器對JSON列記錄的修改采用局部就地更新的方式,而非刪除后重新寫入整個JSON文檔,這么做提高了操作性能和效率。前面介紹的對普通記錄的替換和更新操作同樣適用于含有JSON類型列數(shù)據(jù)的記錄,只不過對記錄中JSON列數(shù)據(jù)操作時要額外加上對應的操作函數(shù)。UPDATE表名 SETJSON類型列名=操作函數(shù)名(列名,路徑,值,...)[WHERE條件];說明:(1)JSON類型操作函數(shù)JSON_INSERT(j,路徑,值,...):加入新的鍵值,如果該名稱的鍵已經(jīng)存在,就不進行任何操作??梢酝瑫r插入多項,下同。JSON_REPLACE(j,路徑,值,...):用于替換JSON中已有的鍵值,只有當該名稱的鍵存在時才執(zhí)行替換,否則不進行任何操作。JSON_SET(j,路徑,值,...):不管原來鍵存不存在都會執(zhí)行操作,存在時對原鍵值進行修改,不存在則加入新鍵。(2)路徑要操作的數(shù)據(jù)項所在的鍵路徑,以“'$.鍵名'”的形式給出,如果有多層JSON對象嵌套,在訪問內(nèi)層JSON的數(shù)據(jù)時,要以“'.'”分隔依次寫出該數(shù)據(jù)項路徑上自外向內(nèi)的所有鍵名。例如:SET@j='{"a":11,"b":12,"cd":{"c":21,"d":22}}';JSON類型列記錄修改(3)值既可以是字符串、數(shù)值類型,也可以是另一個新創(chuàng)建的JSON對象?!纠?.18】修改user表JSON列記錄。1)查詢USEemarket;SELECT帳戶名,姓名,常用地址FROMuserWHEREJSON_EXTRACT(常用地址,'$."地址"."位置"')="堯新大道16號";user表查詢結(jié)果如圖5.29所示。說明:JSON_EXTRACT(常用地址,'$."地址"."位置"')表示找常用地址(JSON類型)在"地址"."位置"路徑下對應的值,為"堯新大道16號"包含2條記錄。JSON類型列記錄修改2)修改常用地址(JSON類型)列內(nèi)容UPDATEuser SET常用地址=JSON_SET(常用地址,'$."地址"',JSON_OBJECT("省","黑龍江","市","大慶","區(qū)","高新","位置","學府街99號")) WHERE帳戶名=''; #(a)UPDATEuser SET常用地址=JSON_INSERT(常用地址,'$."收件人"',"歐陽紅",'$."收件人電話"',"1538099366X",'$."NOTE"',"9:00以后") WHERE帳戶名=''; #(b)UPDATEuser SET常用地址=JSON_REMOVE(常用地址,'$."NOTE"') WHERE帳戶名=''; #(c)SELECT帳戶名,常用地址FROMuserWHERE帳戶名='';user表查詢結(jié)果如圖5.30所示。說明:(a)修改的地址項采用JSON_OBJECT(...)表示。(b)在最外層插入3個鍵值對。(c)刪除'$."NOTE"'鍵對應的鍵值對。04空間類型列記錄修改空間類型列記錄修改空間類型列記錄也可以通過REPLACE語句和UPDATE語句執(zhí)行操作。REPLACEINTO表名(空間列名)VALUES(空間對象值);UPDATE表名SET空間列名=空間對象值...[WHERE條件]需要注意的是:因為在空間類型的列上無法建立主鍵和唯一性約束,若要通過REPLACE語句執(zhí)行修改,就必須為表額外添加一個非空間類型的索引列,否則REPLACE執(zhí)行的將是插入而非修改操作?!纠?.19】修改user表空間列記錄。USEemarket;UPDATEuser SET投遞位置=ST_GeomFromText('POINT(125.14140346.588425)') WHERE帳戶名='';SELECT帳戶名,姓名,常用地址,投遞位置 FROMuser WHERE投遞位置=ST_GeomFromText('POINT(125.14140346.588425)');運行結(jié)果如圖5.31所示。第5章

表記錄操作——刪除記錄01逐個刪除行1.單表刪除符合條件記錄2.多表刪除記錄逐個刪除行1.單表刪除符合條件記錄單表刪除使用的DELETE語句格式為:DELETEFROM表名 [WHERE條件] [ORDERBY...] [LIMIT行數(shù)]其中,WHERE子句指定標識要刪除記錄的條件,如果沒有WHERE子句,則刪除表中所有行;ORDERBY子句按指定的順序刪除行;LIMIT子句限制最大可刪的行數(shù)?!纠?.20】采用多種方式刪除commodity_new表的記錄。注意,在初始練習時,為了避免錯誤刪除記錄(特別是刪除所有記錄),在刪除記錄前可以先對原表進行備份。在Navicat環(huán)境下操作,選擇需要備份的表(例如:commodity_new),右擊,在快捷菜單中選擇“復制表”→“結(jié)構(gòu)和數(shù)據(jù)”。USEemarket;DELETEFROMcommodity_newWHERE商品編號LIKE'2A%';DELETEFROMcommodity_newWHERE商品編號LIKE'1A%'LIMIT2;SELECT商品編號,商品名稱,庫存量FROMcommodity_new; #(a)DELETEFROMcommodity_newORDERBY庫存量ASCLIMIT2;SELECT商品編號,商品名稱,庫存量FROMcommodity_new; #(b)逐個刪除行運行結(jié)果如圖5.32所示。

說明:(a)原商品編號以“2A”打頭、“1A0101”、“1A0201”的記錄不見了。(b)刪除庫存量最小的2條商品記錄:2B1701(庫存量為1682)和1GA101(庫存量為5420)。逐個刪除行2.多表刪除記錄可以在DELETE語句中指定多個表,根據(jù)WHERE子句中的條件從一個或多個表中刪除行。根據(jù)要刪除表在語句中出現(xiàn)的位置,有兩種寫法。(1)只刪除FROM之前列出的表中的匹配行這種寫法的形式為:DELETE表名,...FROM表名,... WHERE連接條件這里,F(xiàn)ROM后面的表名列表中羅列出的表可以不在FROM之前的表名中?;蛘咭部梢允褂眠B接關鍵字(如INNERJOIN等)指定連接方式,例如:DELETEt1,t2FROMt1INNERJOINt2INNERJOINt3 WHEREt1.id=t2.idANDt2.id=t3.id;該語句在檢索要刪除的行時使用t1、t2和t3三個表,但是只刪除表t1和t2中匹配的行。逐個刪除行(2)刪除USING子句之前列出的表中的匹配行寫法為:DELETEFROM表名,...USING表名,... WHERE連接條件這種格式與第(1)種等價,區(qū)別只在于改變了要執(zhí)行刪除的表名的書寫位置,放在FROM之后,以USING子句將它們與用于搜索的表名列表隔開,例如:DELETEFROMt1,t2USINGt1INNERJOINt2INNERJOINt3 WHEREt1.id=t2.idANDt2.id=t3.id;該語句的作用也與(1)中的一樣。前面的示例使用內(nèi)部連接(INNERJOIN),當然多表刪除也可以使用SQL所允許的其他類型的連接,例如:DELETEt1FROMt1LEFTJOINt2ONt1.id=t2.idWHEREt2.idISNULL;這句使用左連接(LEFTJOIN)刪除t1中與t2不匹配的行。逐個刪除行【例5.21】多表刪除。1)當前記錄情況。當前commodity_new表和commodity_list表中記錄如圖5.33所示。

逐個刪除行2)將兩表中有相同商品編號的記錄刪去。USEemarket;DELETEFROMcommodity_new,commodity_list USINGcommodity_new,commodity_list WHEREcommodity_new.商品編號=commodity_list.商品編號;SELECT商品編號,商品名稱FROMcommodity_new; #(a)SELECT商品編號,類別編號FROMcommodity_list; #(b)運行后,commodity_new表和commodity_list表中記錄如圖5.34所示。

02清空表記錄清空表記錄【例5.22】TRUNCATE語句與DELETE的區(qū)別。1)用DELETE測試用DELETE清空orders_new表所有記錄,然后再插入記錄。USEemarket;DELETEFROMorders_new;INSERTINTOorders_new(帳戶名,支付金額,下單時間) VALUES('',98.00,'2020-06-0616:49:52');SELECT*FROMorders_new;運行結(jié)果如圖5.35所示。清空表記錄(2)TRUNCATE測試TRUNCATE先清空orders_new表再插入同樣記錄,然后再插入記錄。TRUNCATETABLEorders_new;INSERTINTOorders_new(帳戶名,支付金額,下單時間) VALUES('',98.00,'2020-06-0616:49:52');SELECT*FROMorders_new;運行結(jié)果如圖5.36所示??梢钥吹?,重新插入的記錄“訂單編號”仍為1。這是因為,TRUNCATE清空表是先將原表整個刪除。從兩種語句執(zhí)行后的輸出信息,也可以看出兩者執(zhí)行機制上的不同,如圖5.37所示。

第5章

表記錄操作——導出記錄01表記錄到形成表1.將全部或者符合條件的記錄形成新表2.將全部或者符合條件的記錄加入到已經(jīng)存在的表中表記錄到形成表1.將全部或者符合條件的記錄形成新表CREATETABLE表名AS(SELECT語句)在創(chuàng)建表結(jié)構(gòu)一章已經(jīng)舉例說明它的應用。2.將全部或者符合條件的記錄加入到已經(jīng)存在的表中INSERTINTO目標表名(列名,...) SELECT(輸出項,...)FROM源表名[WHERE條件] [ONDUPLICATEKEYUPDATE列名=值,...];02表導出形成文件1.表記錄導出2.Navicat導出3.導出圖片表導出形成文件1.表記錄導出在本章“導入文件數(shù)據(jù)”介紹了用LOADDATA...INFILE語句將文件中的數(shù)據(jù)導入到數(shù)據(jù)庫表中。下列命令可把表記錄導出到一個文件中。SELECT*INTOOUTFILE'文件名'導出選項|DUMPFILE'文件名'其中,“導出選項”:[FIELDS [TERMINATEDBY'字符串'] [[OPTIONALLY]ENCLOSEDBY'字符'] [ESCAPEDBY'轉(zhuǎn)義字符']][LINESTERMINATEDBY'字符串']表導出形成文件說明:(1)導出文件默認在服務器主機上創(chuàng)建,并且文件名不能是已經(jīng)存在的,否則可能將原文件覆蓋,需要在文件名前加上具體的路徑。在文件中,數(shù)據(jù)行以一定的形式存放,空格用“\N”表示。(2)FIELDS子句指定導出文件中數(shù)據(jù)存放的格式。可指定下列一個。TERMINATEDBY:列值之間的分隔符號。ENCLOSEDBY:指定包裹字符串的符號(例如雙引號)。若加上關鍵字OPTIONALLY表示所有類型值都放在雙引號之間。ESCAPEDBY:指定轉(zhuǎn)義字符,例如,ESCAPEDBY'*',將“*”指定為轉(zhuǎn)義字符,取代“\”,如空格將表示為“*N”。(3)LINES子句TERMINATEDBY指定一行結(jié)束的標志。如果FIELDS和LINES子句都不指定,則默認聲明以下子句:FIELDSTERMINATEDBY'\t'ENCLOSEDBY''ESCAPEDBY'\\'LINESTERMINATEDBY'\n'(4)如果使用DUMPFILE而非OUTFILE,導出的文件中所有的行都彼此緊挨著放置,行之間沒有任何標記,就成了一個長長的值。表導出形成文件【例5.23】導出mydb數(shù)據(jù)庫youth表的所有記錄到E:\MySQL8\DATAFILE目錄myfile1.txt文件中,要求列值如果是字符就用雙引號標注,列值之間用逗號隔開,每行以“\n”為結(jié)束標志。USEmydb;SELECT*FROMxs INTOOUTFILE'E:/MySQL8/DATAFILE/myfile1.txt' FIELDS TERMINATEDBY',' OPTIONALLYENCLOSEDBY'"' LINESTERMINATEDBY'\n';導出成功后可以查看E:\MySQL8\DATAFILE文件夾下的myfile1.txt文件,文件內(nèi)容如圖5.38所示。說明:(1)如果數(shù)據(jù)庫(表)的字符集與操作系統(tǒng)字符集不同,導出的txt文件會顯示亂碼。(2)如果導出文件不能成功,可以查看系統(tǒng)配置文件my.ini??梢孕薷腫mysqld]段secure_file_priv=,重新啟動MySQL再試。表導出形成文件2.Navicat導出用Navicat導出與導入操作類似,而且數(shù)據(jù)庫(表)的字符集與操作系統(tǒng)字符集不同時,Navicat會自動轉(zhuǎn)換。注意,Navicat導出中字段指表中列,字段名就是列名?!纠?.24】導出emarket數(shù)據(jù)庫orderitems表的數(shù)據(jù)到E:\MySQL8\DATAFILE目錄orderitems1.txt文件中。右擊要導出的orderitems表,在快捷菜單中選擇“導出向?qū)А?,選擇導出格式:文本文件(*.txt),單擊“下一步”,勾選源欄的表名,在對應“導出到”欄(輸入)選擇目錄和文件,文件名:E:\MySQL8\DATAFILE\orderitems1.txt。單擊“高級”按鈕,可以選擇字符集(這里采用默認值)。單擊“下一步”,選擇列名。單擊“下一步”,選擇字段(列)數(shù)據(jù)分隔符和日期格式。單擊“下一步”,單擊“開始”。導出的文件內(nèi)容如圖5.39所示。3.導出圖片用Navicat還可將導入的商品圖片從數(shù)據(jù)庫表中導出,操作方法:右擊商品圖片的blob字段,點“保存數(shù)據(jù)為...”,在彈出“另存為”對話框中選擇保存路徑、指定文件名,后綴寫“.jpg”,點“保存”即可將圖片導出至特定路徑下。第5章

表記錄操作——數(shù)據(jù)庫備份與恢復01mysqldump備份和恢復1.mysqldump備份數(shù)據(jù)庫及表2.mysql恢復數(shù)據(jù)庫及表mysqldump備份和恢復1.mysqldump備份數(shù)據(jù)庫及表mysqldump是MySQL內(nèi)置的工具,允許用戶將數(shù)據(jù)庫指定不同的選項備份到文件、服務器,甚至是壓縮gzip文件中。它實用程序靈活,快速。mysqldump備份包括下列三種寫法:mysqldump[選項]數(shù)據(jù)庫[表]>文件名mysqldump[選項]--databases[選項]數(shù)據(jù)庫...>文件名mysqldump[選項]--all-databases[選項]>文件名說明:-u:后面的用戶需要具有相應權(quán)限才能備份。-p:后面跟密碼不能有空格;也可不跟密碼,在命令回車后再輸入密碼,系統(tǒng)顯示“*”。-h:主機名。如果是本地服務器,可以省略-h參數(shù)。--databases:備份數(shù)據(jù)庫。--all-databases:備份所有數(shù)據(jù)庫。--tables:表。--where:記錄篩選條件。-d:只備份數(shù)據(jù)。-help:得到mysqldump選項表及幫助信息。>:導出符。表示導出到文件名指定的文件中。文件名:可指定存放文件的目錄(例如:E:\MySQL8\DATABAK\),目錄必須已經(jīng)創(chuàng)建,如有同名文件將覆蓋。mysqldump備份和恢復【例5.25】備份數(shù)據(jù)庫。在Windows命令行窗口,進入MySQL安裝目錄下的bin子目錄:E:\>cdE:\MySQL8\mysql-8.0.21-winx64\bin(1)備份emarket數(shù)據(jù)庫(包括所有對象和數(shù)據(jù)):mysqldump-uroot-p--databasesemarket>E:\MySQL8\DATABAK\emarket.sql(2)備份emarket和mytab兩個數(shù)據(jù)庫:mysqldump-uroot-p--databasesemarketmydb>E:/MySQL8/DATABAK/e-m-db2.sql(3)備份OPPO主機test數(shù)據(jù)庫(包括所有對象和數(shù)據(jù)):mysqldump-uroot-pross123456-hOPPO--databasestest>E:\MySQL8\DATABAK\oppo_test.sqlmysqldump備份和恢復(4)備份emarket數(shù)據(jù)庫commodity和supplier表:mysqldump-uroot-p123456--databasesemarket--tablescommoditysupplier>E:\MySQL8\DATABAK\cstables1.sql或者mysqldump-hlocalhost-uroot-p123456emarketcommoditysupplier>E:\MySQL8\DATABAK\cstables2.sql(5)備份emarket數(shù)據(jù)庫所有表結(jié)構(gòu):mysqldump-hlocalhost-uroot-p-demarket>E:\MySQL8\DATABAK\emarket-stru.sql(6)備份所有的數(shù)據(jù)庫表結(jié)構(gòu)mysqldump-hlocalhost-uroot-p-d--all-databases>E:\MySQL8\DATABAK\all_stru.sqlmysqldump備份和恢復2.mysql恢復數(shù)據(jù)庫及表mysqldump備份的文件中存儲的是SQL語句的集合,用戶可以將這些語句還原到服務器上以恢復一個損壞的數(shù)據(jù)庫。此恢復命令只能恢復數(shù)據(jù)庫中被損壞的表及數(shù)據(jù),如果刪除的是整個數(shù)據(jù)庫,將無法恢復,除非再建一個同名的數(shù)據(jù)庫,然后往其中恢復表和數(shù)據(jù)?!纠?.26】先備份本地mydb數(shù)據(jù)庫,再用備份文件將其恢復。(1)備份本地mydb數(shù)據(jù)庫:mysqldump-uroot-p--databasesmydb>E:\MySQL8\DATABAK\mydb.sql(2)刪除mydb數(shù)據(jù)庫中的表(例如mytab)。注意,如果刪除mydb數(shù)據(jù)庫,則需要先創(chuàng)建一個空的mydb數(shù)據(jù)庫,才能恢復mydb數(shù)據(jù)庫。(3)恢復mydb數(shù)據(jù)庫mysql-uroot-p123456mydb<E:\MySQL8\DATABAK\mydb.sql(4)查看mydb數(shù)據(jù)庫中的對象執(zhí)行后可看到被刪的表mytab及其中數(shù)據(jù)又恢復如初了。02使用日志文件備份和恢復1.啟用日志2.處理日志使用日志文件備份和恢復1.啟用日志二進制日志可以在啟動服務器的時候啟用,這需要修改MySQ安裝文件夾中的my.ini配置文件。log-bin[=文件名]說明:加入該選項后,服務器啟動時就會加載該選項,從而啟用二進制日志。如果文件名包含擴展名,則擴展名被忽略。MySQL服務器為每個二進制日志名后面添加一個數(shù)字擴展名。每次啟動服務器或刷新日志時該數(shù)字增加1。如果文件名未給出,則默認為主機名。假設這里文件名取名為bin_log。若不指定目錄,則在MySQL的Data目錄下自動創(chuàng)建二進制日志文件。由于下面使用mysqlbinlog工具處理日志時,日志必須處于bin目錄下,所以日志的路徑就指定為bin目錄路徑,添加的行改為以下這行:log-bin=mysql目錄/bin/bin_log保存,重啟服務器。重啟服務器的方法為,先關閉服務器,在窗口中輸入以下命令:netstopMySQL服務名再啟動服務器:netstartMySQL服務名此時,MySQL安裝目錄的bin目錄下多出了兩個文件:bin_log.000001和bin_log.index。使用日志文件備份和恢復2.處理日志W(wǎng)indows命令行窗口下,MySQL安裝目錄\bin下。1)使用mysqlbinlog實用工具可以查看和處理二進制日志文件mysqlbinlog[選項]log-file

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論