數(shù)據(jù)庫原理與應(yīng)用 課件 張千帆 第8-10章 視圖;存儲(chǔ)過程、存儲(chǔ)函數(shù)和觸發(fā)器;數(shù)據(jù)庫備份與恢復(fù)_第1頁
數(shù)據(jù)庫原理與應(yīng)用 課件 張千帆 第8-10章 視圖;存儲(chǔ)過程、存儲(chǔ)函數(shù)和觸發(fā)器;數(shù)據(jù)庫備份與恢復(fù)_第2頁
數(shù)據(jù)庫原理與應(yīng)用 課件 張千帆 第8-10章 視圖;存儲(chǔ)過程、存儲(chǔ)函數(shù)和觸發(fā)器;數(shù)據(jù)庫備份與恢復(fù)_第3頁
數(shù)據(jù)庫原理與應(yīng)用 課件 張千帆 第8-10章 視圖;存儲(chǔ)過程、存儲(chǔ)函數(shù)和觸發(fā)器;數(shù)據(jù)庫備份與恢復(fù)_第4頁
數(shù)據(jù)庫原理與應(yīng)用 課件 張千帆 第8-10章 視圖;存儲(chǔ)過程、存儲(chǔ)函數(shù)和觸發(fā)器;數(shù)據(jù)庫備份與恢復(fù)_第5頁
已閱讀5頁,還剩104頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第8章視圖本章介紹視圖的基本概念和作用,以及與視圖有關(guān)的基本操作數(shù)據(jù)庫系統(tǒng)原理及應(yīng)用主要內(nèi)容8.1視圖的概念8.2定義視圖8.3基于視圖的數(shù)據(jù)操縱8.4基于視圖的數(shù)據(jù)查詢8.1視圖的概念視圖是從一個(gè)或幾個(gè)基本表(或視圖)導(dǎo)出的表,它與基本表不同,是一個(gè)虛表。數(shù)據(jù)庫中只存放視圖的定義,而不存放視圖對應(yīng)的數(shù)據(jù),這些數(shù)據(jù)仍存放在原來的基本表中?;颈碇械臄?shù)據(jù)發(fā)生變化,從視圖中查詢出的數(shù)據(jù)也隨之改變。8.2定義視圖CREATEVIEWview_name[(column_list)]ASselect_statement[WITHCHECKOPTION]SQL中,CREATEVIEW語句用于創(chuàng)建視圖,其基本的語法格式為:參數(shù):column_list:組成視圖的屬性列名:全部省略或全部指定。全部省略:

由子查詢中SELECT目標(biāo)列中的諸字段組成

明確指定視圖的所有列名:

目標(biāo)列是聚集函數(shù)、列表達(dá)式

多表中的同名

希望在在視圖中為某個(gè)列定義一個(gè)更合適的名字時(shí)select_statement:SELECT語句,但不能包含ORDERBY子句和DISTINCT短語。WITHCHECKOPTION:使用該子句,系統(tǒng)自動(dòng)檢查視圖的更新操作是否滿足視圖定義中查詢語句的條件表達(dá)式;如果違反條件表達(dá)式,則拒絕相應(yīng)的操作。8.2.1創(chuàng)建單源表視圖單源表視圖是指視圖的數(shù)據(jù)取自一個(gè)基本表的部分行、列,它的行、列與基本表的行、列相對應(yīng)。[例8-1]:創(chuàng)建視圖view_card,顯示所有掛失的校園卡的卡號(hào)和余額。CREATEVIEWview_cardASSELECTCID卡號(hào),balance余額FROMcardWHEREstate='1';8.2.2創(chuàng)建多源表視圖多源視圖是指視圖的數(shù)據(jù)來自多個(gè)基本表。CREATEVIEWview_salebill20200706ASSELECT*FROMview_salebillWHEREsaledate='2020-7-6';[例8-2]:在視圖view_salebill上創(chuàng)建視圖view_salebill20200706,查詢2020年7月6日單筆消費(fèi)金額在10-20元之間的消費(fèi)信息。8.2.3在視圖上創(chuàng)建視圖視圖不僅可以建立在基本表上,也可以建立在已有視圖上。[例8-3]:在視圖view_salebill上創(chuàng)建視圖view_salebill20200706,查詢2020年7月6日單筆消費(fèi)金額在10-20元之間的消費(fèi)信息。CREATEVIEWview_salebill20200706ASSELECT*FROMview_salebillWHEREsaledate='2020-7-6';8.2.4修改視圖SQL中,ALTERVIEW語句用來修改視圖的定義,其基本的語法格式為:ALTERVIEWview_name[(column_list)]ASselect_statement[WITHCHECKOPTION]ALTERVIEWview_salebill20200706ASSELECTCID,payamountFROMview_salebillWHEREsaledate='2020-7-6';[例8-4]:將視圖view_salebill20200706改為僅查詢CID和payamount列,其他條件不變。8.2.5刪除視圖SQL中,DROPVIEW語句用于刪除視圖,其基本的語法格式為:DROPVIEW[IFEXISTS]view_name[,view_name]...參數(shù):IFEXISTS:不使用IFEXISTS,在視圖列表中命名的視圖不存在時(shí)系統(tǒng)會(huì)提示錯(cuò)誤。使用IFEXISTS可以避免刪除不存在的視圖時(shí)發(fā)生錯(cuò)誤。view_name:可以一次刪除一個(gè)或多個(gè)視圖,多個(gè)視圖之間用逗號(hào)分開,且必須在每個(gè)視圖上擁有DROP權(quán)限。8.2.5刪除視圖DROPVIEW語句從數(shù)據(jù)字典中刪除指定的視圖定義。視圖刪除后,由該視圖導(dǎo)出的其他視圖定義仍在數(shù)據(jù)字典中,但已不能使用,必須使用DROPVIEW語句刪除。刪除基表后,由該基表導(dǎo)出的所有視圖定義都必須使用DROPVIEW語句刪除。[例8-5]:刪除視圖view_sname和視圖view_college。DROPVIEWview_sname,view_college;8.3基于視圖的數(shù)據(jù)操縱視圖的數(shù)據(jù)操縱包括INSERT操作、UPDATE操作、DELETE操作。由于視圖是不存儲(chǔ)數(shù)據(jù)的虛表,視圖是否允許更新要看對視圖的更新能否轉(zhuǎn)化為對基本表的更新。排除以下情況后,視圖的更新受到嚴(yán)格的限制。定義在多個(gè)基本表或其他視圖之上的視圖,不允許更新。定義視圖的SELECT語句含有GROUPBY、DISTINCT、表達(dá)式或聚集函數(shù)等,這類視圖可執(zhí)行刪除操作,但不允許進(jìn)行插入或修改操作。對于可更新的視圖,如果定義視圖時(shí)使用了WITHCHECKOPTION子句,對視圖的更新操作要保證插入、修改和刪除的行滿足視圖定義中查詢語句的條件表達(dá)式。8.4基于視圖的數(shù)據(jù)查詢對于已經(jīng)定義好的視圖,通過視圖查詢數(shù)據(jù)與通過基本表查詢數(shù)據(jù)一樣,適用SELECT語句做查詢操作。[例8-6]:通過視圖view_totalamount查詢第一食堂的營業(yè)額。SELECT商戶,營業(yè)額

FROMview_totalamountWHERE商戶='第一食堂';第9章存儲(chǔ)過程、存儲(chǔ)函數(shù)和觸發(fā)器本章介紹存儲(chǔ)過程、存儲(chǔ)函數(shù)和觸發(fā)器等數(shù)據(jù)庫對象的基本概念以及創(chuàng)建、調(diào)用、修改和刪除方法數(shù)據(jù)庫系統(tǒng)原理及應(yīng)用9.1存儲(chǔ)過程9.2存儲(chǔ)過程中的復(fù)合語句9.3存儲(chǔ)函數(shù)9.4觸發(fā)器主要內(nèi)容存儲(chǔ)過程9.19.1.1存儲(chǔ)過程的基本概念存儲(chǔ)過程(StoredProcedure)是一種把重復(fù)的任務(wù)操作封裝起來的方法,是一組為了完成特定功能的SQL語句和可選控制流語句的預(yù)編譯集合。存儲(chǔ)過程創(chuàng)建后只需編譯一次,以后即可多次執(zhí)行。執(zhí)行效率高靈活性強(qiáng)保證安全性和完整性執(zhí)行效率高降低網(wǎng)絡(luò)通信量存儲(chǔ)過程的參數(shù)不僅可以向存儲(chǔ)過程傳入值,也可以由存儲(chǔ)過程向外輸出參數(shù)值,存儲(chǔ)過程和調(diào)用存儲(chǔ)過程的對象之間的可以進(jìn)行雙向的數(shù)據(jù)交換。按照傳遞數(shù)據(jù)的方向不同,存儲(chǔ)過程中的參數(shù)類型有三種:

IN參數(shù)

OUT參數(shù)

INOUT參數(shù)。9.1.2創(chuàng)建存儲(chǔ)過程參數(shù):(1)sp_name:存儲(chǔ)過程名。一個(gè)數(shù)據(jù)庫中存儲(chǔ)過程的名字必須唯一。(2)[proc_parameter[,...]]:存儲(chǔ)過程的參數(shù)。存儲(chǔ)過程的參數(shù)是任意的,可以有一個(gè)或多個(gè)參數(shù),也可以沒有參數(shù)。(3)[IN|OUT|INOUT]param_nametype:定義參數(shù)類型、參數(shù)名和參數(shù)的數(shù)據(jù)類型。IN為默認(rèn)參數(shù)類型。(4)routine_body:存儲(chǔ)過程中的SQL語句。CREATEPROCEDUREsp_name([proc_parameter[,...]])routine_bodyproc_parameter:[IN|OUT|INOUT]param_nametypeCREATEPROCEDURE語句用于創(chuàng)建存儲(chǔ)過程,其基本的語法格式為:9.1.2創(chuàng)建存儲(chǔ)過程[例9-1]:建立存儲(chǔ)過程p_increase,使用OUT參數(shù)total_payamount輸出消費(fèi)清單的總金額,使用INOUT參數(shù)incr_number輸入當(dāng)前消費(fèi)清單中的最大流水號(hào)并輸出下一個(gè)流水號(hào)。CREATEPROCEDUREp_increase(OUTtotal_payamountVARCHAR(25),INOUTincr_numberINT)BEGINSELECTSUM(payamount)INTOtotal_payamountFROMsalebill;SETincr_number=incr_number+1;END;9.1.3調(diào)用存儲(chǔ)過程CALLsp_name([proc_parameter[,...]])CALL語句用于調(diào)用CREATEPROCEDURE定義好的存儲(chǔ)過程,

其基本的語法格式為:對于有OUT或INOUT參數(shù)的存儲(chǔ)過程,調(diào)用時(shí)需要先聲明參數(shù)對應(yīng)的變量,用來保存參數(shù)的返回值。9.1.3調(diào)用存儲(chǔ)過程[例9-2]:調(diào)用存儲(chǔ)過程p_increase。SET@incr_number=18;CALLp_increase(@total_payamount,@incr_number);調(diào)用語句執(zhí)行后,查看OUT參數(shù)和INOUT參數(shù)的值:

SELECT@total_payamount,@incr_number;結(jié)果如圖所示:9.1.4刪除存儲(chǔ)過程DROPPROCEDURE語句用于刪除存儲(chǔ)過程,

其基本的語法格式為:DROPPROCEDURE[IFEXISTS]sp_name;參數(shù):IFEXISTS:用于防止因誤刪除不存在的存儲(chǔ)過程而引發(fā)錯(cuò)誤。[例9-3]:刪除存儲(chǔ)過程p_increase。DROPPROCEDUREp_increase;9.1.5修改存儲(chǔ)過程ALTERPROCEDURE語句用于修改存儲(chǔ)過程,其基本語法為:ALTER{PROCEDURE|FUNCTION}proc_or_func[characterustic...]characteristics:指定存儲(chǔ)過程特性,包括:{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}:指定子程序使用存儲(chǔ)過程的限制。CONTAINSSQL:說明子程序包含SQL語句,但是不包含寫數(shù)據(jù)語句;NOSQL:說明子程序不包含SQL語句;READSSQLDATA:說明子程序包含讀數(shù)據(jù)讀數(shù)據(jù)語句;MODIFIESSQLDATA:說明子程序包含寫數(shù)據(jù)語句。9.1.5修改存儲(chǔ)過程ALTERPROCEDURE語句作用有限,不能更改存儲(chǔ)過程的參數(shù)或主體。如果需要進(jìn)行此類更改,必須使用DROPPROCEDURE語句刪除舊的存儲(chǔ)過程,再用CREATEPROCEDURE新建一個(gè)存儲(chǔ)過程。SQLSECURITY{DEFINER|INVOKER}:指明誰有權(quán)限執(zhí)行,默認(rèn)值:DEFINER;DEFINER:只有定義者才能執(zhí)行INVOKER:擁有權(quán)限的調(diào)用者才可以執(zhí)行COMMNET:注釋信息注意:存儲(chǔ)過程中的復(fù)合語句9.29.2.1變量DECLARE命令用于在存儲(chǔ)過程中聲明局部變量,語法格式如下:DECLAREvar_name[,var_name]...type[DEFAULTvalue]參數(shù):1)var_name:變量名。2)Type:變量的數(shù)據(jù)類型。3)DEFAULTvalue:為變量提供默認(rèn)值,該值可以是常數(shù),也可以是表達(dá)式。如果沒有DEFAULT子句,則變量的初始值為NULL。9.2.1變量[例9-4]:在存儲(chǔ)過程p_business中聲明兩個(gè)變量new_id和new_name,通過調(diào)用存儲(chǔ)過程為變量賦值,然后把變量值插入business表。CREATEPROCEDUREp_business(xCHAR(4),yVARCHAR(20))BEGINDECLAREnew_idCHAR(4)DEFAULTx;DECLAREnew_nameVARCHAR(20)DEFAULTy;INSERTINTObusinessvalues(x,y);SELECT*FROMbusinessWHEREBID=new_id;END;CALLp_business('B008','東三食堂');9.2.2BEGIN…ENDBEGIN…END用來將一個(gè)或多個(gè)語句設(shè)定為一個(gè)程序塊,其基本的語法格式為:[begin_label:]BEGIN

[statement_list]END[end_label]參數(shù):

1)label:標(biāo)簽,相當(dāng)于給程序塊命名。

2)BEGIN…END:經(jīng)常在條件語句、循環(huán)語句等中使用。一個(gè)BEGIN…END程

序塊中還可以嵌套另外的BEGIN…END程序塊。3)statement_list:語句列表是一個(gè)包含一個(gè)或多個(gè)語句的程序塊,并用關(guān)鍵字BEGIN和END括起來。語句列表可以出現(xiàn)在存儲(chǔ)過程、存儲(chǔ)函數(shù)、觸發(fā)器和事務(wù)中。9.2.3條件語句IF語句的基本語法格式為:IF語句IFsearch_conditionTHENstatement_list[ELSEIFsearch_conditionTHENstatement_list]...[ELSEstatement_list]ENDIF參數(shù):search_condition:條件表達(dá)式。條件為真執(zhí)行IF后的程序塊,否則執(zhí)行ELSE后面的程序塊。IF語句可以嵌套使用。9.2.3條件語句[例9-5]:創(chuàng)建存儲(chǔ)過程p_scale,查詢商戶的經(jīng)營規(guī)模。如果該商戶過去一年的營業(yè)額少于10萬元?jiǎng)t為“小商戶”;10萬到50萬之間為“中等商戶”;超過50萬元?jiǎng)t為“大商戶”。CREATEPROCEDUREp_scale(INidCHAR(4),OUTmessageVARCHAR(20))BEGINDECLAREsumamoutDECIMAL(10,2);SELECTSUM(payamount)INTOsumamoutFROMsalebillWHEREBID=id;IFsumamout<100000THENSETmessage='小商戶';ELSEIFsumamout<500000THENSETmessage='中等商戶';ELSESETmessage='大商戶';ENDIF;ENDIF;SELECTid,message;END;9.2.3條件語句CASE語句可以嵌套在SQL語句中使用,CASE語句的基本語法格式為::CASE語句CASEWHENsearch_conditionTHENstatement_list[WHENsearch_conditionTHENstatement_list]...[ELSEstatement_list]ENDCASE參數(shù):1)search_condition:條件表達(dá)式。2)WHENsearch_conditionTHENstatement_list:當(dāng)WHEN子句的條件表達(dá)式為邏輯真值時(shí)執(zhí)行THEN后程序塊,然后跳出CASE語句。3)ELSEstatement_list:如果CASE語句中包含ELSE子句,則當(dāng)所有WHEN子句的條件表達(dá)式都為邏輯假時(shí),就執(zhí)行ELSE子句中的程序塊。如果CASE語句中不包含ELSE子句且所有WHEN子句的條件表達(dá)式都為邏輯假時(shí),CASE語句返回NULL。9.2.3條件語句[例9-6]:統(tǒng)計(jì)各商戶當(dāng)年的營業(yè)額,如果營業(yè)額超過50萬元,則輸出“大商戶”;

少于10萬元?jiǎng)t輸出“小商戶”;10萬到50萬之間輸出“中等商戶”。SELECTBID商戶編號(hào),CASEWHENSUM(payamount)>500000THEN'大商戶'WHENSUM(payamount)<100000THEN'小商戶'ELSE'中等商戶'END商戶規(guī)模FROMsalebillWHEREYEAR(saledate)=YEAR(CURRENT_DATE())GROUPBYBID;9.2.4ITERATE語句ITERATE語句用在LOOP、REPEAT、WHILE等循環(huán)結(jié)構(gòu)內(nèi),表示再次循環(huán),語法格式為:ITERATElabel參數(shù):

label:循環(huán)語句的標(biāo)簽。9.2.5LEAVE語句LEAVE語句可以用在BEGIN...END語句內(nèi)或者LOOP、REPEAT、WHILE等循環(huán)結(jié)構(gòu)內(nèi),作用是退出給定標(biāo)簽的BEGIN...END流程控制語句或終止循環(huán),語法格式為:LEAVElabel參數(shù):

label:復(fù)合語句的標(biāo)簽。9.2.6循環(huán)語句[begin_label:]LOOPstatement_listENDLOOP[end_label]參數(shù):statement_list:循環(huán)體中允許重復(fù)執(zhí)行的語句列表,如果該語句列表由多個(gè)語句組成,每個(gè)語句以分號(hào)分開。重復(fù)循環(huán)循環(huán)體中的語句,直到循環(huán)終止。通常,循環(huán)體中通過ITERATE子句開始下一次循環(huán),通過LEAVE子句來終止循環(huán)。1)LOOP語句LOOP語句可以構(gòu)造一個(gè)循環(huán)結(jié)構(gòu),其基本的語法格式為:9.2.6循環(huán)語句[例9-7]:創(chuàng)建存儲(chǔ)過程p_doloop,求解n!。CREATEPROCEDUREp_doloop(INin_countINT)BEGINDECLARECOUNTINTDEFAULT1;DECLAREfactorialINTDEFAULT1;label1:LOOPSETfactorial=factorial*COUNT;SETCOUNT=COUNT+1; IFCOUNT<=in_countTHENITERATElabel1;ENDIF;LEAVElabel1;ENDLOOPlabel1;SELECTfactorial; END;調(diào)用存儲(chǔ)過程p_doloop,求解5!

CALLp_doloop(5);執(zhí)行結(jié)果如下表所示。9.2.6循環(huán)語句[begin_label:]REPEATstatement_listUNTILsearch_conditionENDREPEAT[end_label]參數(shù):1)search_condition:條件表達(dá)式。2)statement_list:允許重復(fù)執(zhí)行的語句序列。REPEAT至少進(jìn)行一次循環(huán),直到search_condition表達(dá)式為真時(shí)終止循環(huán)。statement_list由一個(gè)或多個(gè)語句組成,每個(gè)語句以分號(hào)分開。2)REPEAT語句REPEAT語句的基本語法格式為:9.2.6循環(huán)語句[例9-8]:創(chuàng)建存儲(chǔ)過程p_dorepeat,求解n!。CREATEPROCEDUREp_dorepeat(INin_countINT)BEGINDECLARECOUNTINTDEFAULT1;DECLAREfactorialINTDEFAULT1;REPEATSETfactorial=factorial*COUNT;SETCOUNT=COUNT+1;UNTILCOUNT>in_countENDREPEAT; SELECTfactorial;END;調(diào)用存儲(chǔ)過程p_dorepeat,求解5!CALLp_dorepeat(5);執(zhí)行結(jié)果如下表所示。9.2.6循環(huán)語句[begin_label:]WHILEsearch_conditionDOstatement_listENDWHILE[end_label]參數(shù)同REPEAT。當(dāng)WHILE的條件表達(dá)式為真,循環(huán)體中的語句列表就會(huì)重復(fù)執(zhí)行。如果條件表達(dá)式在第一次循環(huán)開始之時(shí)就為假,WHILE的循環(huán)體就一次也沒有執(zhí)行,這是和REPEAT不同之處。3)WHILE語句WHILE語句的基本語法格式為:9.2.6循環(huán)語句[例9-9]:創(chuàng)建存儲(chǔ)過程p_dowhile,求解n!。CREATEPROCEDUREp_dowhile(INin_countINT)BEGINDECLARECOUNTINTDEFAULT1;DECLAREfactorialINTDEFAULT1;WHILECOUNT<=in_countDOSETfactorial=factorial*COUNT;SETCOUNT=COUNT+1;ENDWHILE; SELECTfactorial;END;調(diào)用存儲(chǔ)過程p_dowhile,求解5!CALLp_dowhile(5);執(zhí)行結(jié)果如下表所示。9.2.7游標(biāo)存儲(chǔ)過程中的條件語句、循環(huán)語句操作的對象是單行數(shù)據(jù),但是SQL語言是基于集合運(yùn)算的,查詢結(jié)果是一般是由多行組成的結(jié)果集。這兩類數(shù)據(jù)操作的處理對象和處理結(jié)果是不匹配的,需要把對集合的操作轉(zhuǎn)換成對單行的處理。游標(biāo)是一種從包含多個(gè)行的結(jié)果集中每次提取一行的機(jī)制。游標(biāo)一次指向一行,并通過游標(biāo)的順序推進(jìn)可以依次指向查詢結(jié)果集的所有行,實(shí)現(xiàn)對查詢結(jié)果集的遍歷。MySQL支持存儲(chǔ)過程內(nèi)部的游標(biāo)和服務(wù)器端的游標(biāo),二者實(shí)現(xiàn)方式相同。MySQL中游標(biāo)是只讀的,不可更新。使用游標(biāo)之前需要先聲明游標(biāo)、打開游標(biāo),然后才能滾動(dòng)游標(biāo)查找數(shù)據(jù),游標(biāo)不使用時(shí)要關(guān)閉游標(biāo)。9.2.7游標(biāo)DECLAREcursor_nameCURSORFORselect_statement參數(shù):(1)cursor_name:游標(biāo)名。存儲(chǔ)過程可能包含多個(gè)游標(biāo),但是在給定程序塊中每個(gè)游標(biāo)必須具有唯一的名稱。(2)CURSORFORselect_statement:將游標(biāo)與SELECT語句的查詢結(jié)果集建立關(guān)聯(lián)。1)聲明游標(biāo)游標(biāo)的聲明語句必須出現(xiàn)在變量和條件的聲明語句之后、處理程序的聲明語句之前。DECLARE語句用于聲明游標(biāo),其基本的語法格式為:9.2.7游標(biāo)OPENcursor_name該語句是執(zhí)行游標(biāo)聲明中的SELECT語句,把查詢結(jié)果取到緩沖區(qū),然后使游標(biāo)處于活動(dòng)狀態(tài)并指向某個(gè)地址,從該地址可以檢索到游標(biāo)所關(guān)聯(lián)的結(jié)果集的第一行。可見,游標(biāo)充當(dāng)?shù)氖侵羔樀淖饔谩?)打開游標(biāo)OPEN語句用于打開已聲明的游標(biāo),其語法格式為:9.2.7游標(biāo)FETCH[[NEXT]FROM]cursor_nameINTOvar_name[,var_name]...參數(shù):var_name[,var_name]...:輸出變量名,變量的數(shù)據(jù)類型和數(shù)量必須與SELECT語句的目標(biāo)列一一對應(yīng)。3)推進(jìn)游標(biāo)FETCH語句可以推進(jìn)游標(biāo),獲取游標(biāo)所指向的數(shù)據(jù)行,將提取的列值存儲(chǔ)在輸出變量中,并將游標(biāo)推進(jìn)到下一行。其基本的語法格式為:當(dāng)游標(biāo)已經(jīng)指向最后一行時(shí)繼續(xù)執(zhí)行FETCH語句會(huì)造成游標(biāo)溢出,可以在系統(tǒng)引發(fā)NOTFOUND錯(cuò)誤時(shí)定義一個(gè)CONTINUE的事件,指定這個(gè)事件發(fā)生時(shí)修改done變量的值。如果done=1,就結(jié)束循環(huán)。語法格式為:DECLARECONTINUEHANDLERFORNOTFOUNDSETdone=1;9.2.7游標(biāo)CLOSEcursor_name關(guān)閉的游標(biāo)如果需要再次使用,可以用另一個(gè)OPEN語句打開,重新與查詢結(jié)果集產(chǎn)生關(guān)聯(lián)。4)關(guān)閉游標(biāo)CLOSE語句用于關(guān)閉先前打開的游標(biāo),釋放結(jié)果集占用的緩沖區(qū)及其他資源,其語法格式為:9.2.7游標(biāo)[例9-10]:創(chuàng)建存儲(chǔ)過程p_bname_list,使用游標(biāo)輸出所有商戶的名稱。CREATEPROCEDUREp_bname_list(INOUTbname_listVARCHAR(100))BEGINDECLAREdoneINTDEFAULT0;DECLAREv_bnameVARCHAR(20)DEFAULT'';DECLAREbname_cursorCURSORFORSELECTbnameFROMbusiness;DECLARECONTINUEHANDLERFORNOTFOUNDSETdone=1;OPENbname_cursor;get_bname:LOOPFETCHbname_cursorINTOv_bname;IFdone=1THENLEAVEget_bname;ENDIF;SETbname_list=CONCAT(v_bname,';',bname_list);ENDLOOPget_bname;CLOSEbname_cursor;END;存儲(chǔ)函數(shù)9.3存儲(chǔ)函數(shù)和存儲(chǔ)過程的區(qū)別

存儲(chǔ)函數(shù)的限制比較多,例如不能用臨時(shí)表,只能用表變量,而存儲(chǔ)過程的限制較少,存儲(chǔ)過程的實(shí)現(xiàn)功能要復(fù)雜些,而函數(shù)的實(shí)現(xiàn)功能針對性比較強(qiáng)。返回值不同。存儲(chǔ)函數(shù)必須有返回值,且僅返回一個(gè)結(jié)果值;存儲(chǔ)過程可以沒有返回值,但是能返回結(jié)果集(out,inout)。調(diào)用時(shí)的不同。存儲(chǔ)函數(shù)嵌入在SQL中使用,可以在select存儲(chǔ)函數(shù)名(變量值);存儲(chǔ)過程通過call語句調(diào)用call存儲(chǔ)過程名。參數(shù)的不同。存儲(chǔ)函數(shù)的參數(shù)類型類似于IN參數(shù),沒有類似于OUT和INOUT的參數(shù);存儲(chǔ)過程的參數(shù)類型有三種,in、out和inout:9.3.1創(chuàng)建存儲(chǔ)函數(shù)CREATEFUNCTION語句用于創(chuàng)建存儲(chǔ)函數(shù),其基本的語法格式為:CREATEFUNCTIONsp_name([func_parameter[,...]])RETURNStype[NOT]DETERMINISTICroutine_bodyfunc_parameter: param_nametype參數(shù):(1)sp_name:存儲(chǔ)函數(shù)的名稱。(2)param_nametype:參數(shù)的名稱和數(shù)據(jù)類型。存儲(chǔ)函數(shù)只有輸入?yún)?shù),參數(shù)不能IN,OUT,INOUT修飾。(3)RETURNStype:指定存儲(chǔ)函數(shù)返回值的數(shù)據(jù)類型。(4)[NOT]DETERMINISTIC:對于相同的輸入?yún)?shù),如果函數(shù)返回相同的結(jié)果,則被認(rèn)為是確定性的,否則不是確定性的。必須決定一個(gè)存儲(chǔ)函數(shù)是否是確定性的。(5)routine_body:可以是單個(gè)語句也可以是復(fù)合語句,存儲(chǔ)過程中適用的SQL語句也適用于存儲(chǔ)函數(shù)。9.3.1創(chuàng)建存儲(chǔ)函數(shù)[例9-11]:創(chuàng)建函數(shù)NameById,根據(jù)輸入的學(xué)號(hào)輸出該學(xué)生的姓名。CREATEFUNCTIONNameById(search_idCHAR(12))RETURNSVARCHAR(20)DETERMINISTICBEGINRETURN(SELECTsnameFROMstudentWHERESID=search_id);END;9.3.2調(diào)用存儲(chǔ)函數(shù)成功創(chuàng)建的存儲(chǔ)函數(shù)可以使用SELECT進(jìn)行調(diào)用,語法格式為:SELECTsp_name([param_name[,...]]);[例9-12]:調(diào)用存儲(chǔ)函數(shù)NameByID查看學(xué)號(hào)為202003010004的學(xué)生姓名。SELECTNameByID('202003010004');9.3.3修改存儲(chǔ)函數(shù)ALTERFUNCTION語句用于修改存儲(chǔ)函數(shù)的某些相關(guān)特征。若要修改存儲(chǔ)函數(shù)的內(nèi)容,則需要先刪除該存儲(chǔ)函數(shù),然后重新創(chuàng)建。其語法格式為:ALTERFUNCTION[schema_name.]function_name([{@parameter_name[AS][type_schema_name.]parameter_data_type[=default]}[,...n]])RETURNSreturn_data_type[WITH<function_option>[,...n]][AS]BEGINfunction_bodyRETURNscalar_expressionEND[;]9.3.4刪除存儲(chǔ)函數(shù)DROPFUNCTION語句用于刪除存儲(chǔ)函數(shù),其基本的語法格式為:DROPFUNCTION[IFEXISTS]sp_name;參數(shù):(1)sp_name:要?jiǎng)h除的存儲(chǔ)函數(shù)的名稱。(2)IFEXISTS:使用IFEXISTS可防止因刪除不存在的存儲(chǔ)函數(shù)而引發(fā)錯(cuò)誤。[例9-13]:刪除存儲(chǔ)函數(shù)NameById。DROPFUNCTIONNameById;觸發(fā)器9.49.4.1觸發(fā)器的基本概念觸發(fā)器(Trigger)是一種特殊類型的存儲(chǔ)過程,采用事件驅(qū)動(dòng)機(jī)制。當(dāng)某個(gè)觸發(fā)事件發(fā)生時(shí),定義在觸發(fā)器中的功能將被DBMS自動(dòng)執(zhí)行。觸發(fā)器可以用于SQLServer約束、默認(rèn)值和規(guī)則的完整性檢查,還可以完成難以用普通約束實(shí)現(xiàn)的復(fù)雜功能。當(dāng)一個(gè)觸發(fā)器建立后,它作為一個(gè)數(shù)據(jù)庫對象被存儲(chǔ)。常用的觸發(fā)器:INSERT觸發(fā)器、UPDATE觸發(fā)器、DELETE觸發(fā)器9.4.1觸發(fā)器的基本概念觸發(fā)器由三個(gè)部分組成∶事件、條件、動(dòng)作?;蚍Q為觸發(fā)事件,當(dāng)某個(gè)事件發(fā)生的時(shí)候就運(yùn)行觸發(fā)器判斷是否達(dá)到指定的條件,如果沒有達(dá)到條件將不執(zhí)行動(dòng)作,可以留空,表示直接執(zhí)行動(dòng)作。條件通過后所要做的事情。9.4.2創(chuàng)建觸發(fā)器CREATETRIGGER語句用于創(chuàng)建觸發(fā)器。該語句指定了觸發(fā)表、觸發(fā)時(shí)機(jī)、觸發(fā)事件和觸發(fā)器的所有指令。其基本的語法格式為:CREATETRIGGERtrigger_name{BEFORE|AFTER}{INSERT|UPDATE|DELETE}ONtbl_nameFOREACHROW[{FOLLOWS|PRECEDES}other_trigger_name]trigger_body參數(shù):1){BEFORE|AFTER}:觸發(fā)時(shí)機(jī),其中BEFORE為前觸發(fā)型觸發(fā)器,AFTER為后觸發(fā)型觸發(fā)器。前和后是指觸發(fā)器在觸發(fā)表中引發(fā)觸發(fā)事件的數(shù)據(jù)操作語句之前還是之后執(zhí)行。2){INSERT|UPDATE|DELETE}:觸發(fā)事件,即在表上執(zhí)行哪些數(shù)據(jù)操縱語句時(shí)將激活觸發(fā)器。必須至少指定一個(gè)選項(xiàng),多個(gè)選項(xiàng)之間用逗號(hào)分開。3)ONtbl_nameFOREACHROW:MySQL只支持行級觸發(fā)器,影響多少行觸發(fā)器就會(huì)執(zhí)行多少次。4){FOLLOWS|PRECEDES}other_trigger_name:觸發(fā)順序。5)trigger_body:觸發(fā)器主體。9.4.2創(chuàng)建觸發(fā)器1)NEW表和OLD表MySQL觸發(fā)器中定義了NEW和OLD兩個(gè)虛表,用來臨時(shí)存儲(chǔ)觸發(fā)表中使觸發(fā)事件發(fā)生的那一行數(shù)據(jù)。NEW表和OLD表的使用如下表所示。觸發(fā)器類型NEW表和OLD表的使用INSERT型觸發(fā)器NEW表存儲(chǔ)將要(BEFORE)或已經(jīng)(AFTER)插入的數(shù)據(jù)行。DELETE型觸發(fā)器OLD表存儲(chǔ)將要或已經(jīng)被刪除的數(shù)據(jù)行。UPDATE型觸發(fā)器OLD表存儲(chǔ)將要或已經(jīng)被更新的原始數(shù)據(jù)行,又需要使用NEW表存儲(chǔ)將要或已經(jīng)插入的數(shù)據(jù)行。9.4.2創(chuàng)建觸發(fā)器2)前觸發(fā)型觸發(fā)器前觸發(fā)型觸發(fā)器成功執(zhí)行后,再執(zhí)行觸發(fā)表中的觸發(fā)語句。如果觸發(fā)失敗,則不執(zhí)行后繼的觸發(fā)表中的觸發(fā)語句。[例9-14]:創(chuàng)建前觸發(fā)型觸發(fā)器operation,保證只有狀態(tài)正常且卡內(nèi)余額大于消費(fèi)金額的校園卡才能進(jìn)行消費(fèi)。CREATETRIGGERoperationBEFOREINSERTONsalebillFOREACHROWUPDATEcardSETbalance=balance-NEW.payamountWHERECID=NEW.CID;9.4.2創(chuàng)建觸發(fā)器3)后觸發(fā)型觸發(fā)器后觸發(fā)型觸發(fā)器在觸發(fā)表中觸發(fā)語句成功執(zhí)行并且所有的約束檢查也成功完成后才執(zhí)行。觸發(fā)器觸發(fā)失敗時(shí),需要回滾已經(jīng)執(zhí)行的語句,以保持?jǐn)?shù)據(jù)一致性。[例9-15]:刪除salebill表的前觸發(fā)型觸發(fā)器operation后,建立后觸發(fā)型觸發(fā)器operation2,生成消費(fèi)記錄后自動(dòng)修改校園卡的余額。CREATETRIGGERoperation2AFTERINSERTONsalebillFOREACHROWUPDATEcardSETbalance=balance-NEW.payamountWHERECID=NEW.CID;9.4.2創(chuàng)建觸發(fā)器4)多個(gè)觸發(fā)器的執(zhí)行一個(gè)表中可以同時(shí)存在多個(gè)觸發(fā)器,對于相同事件觸發(fā)的多個(gè)觸發(fā)器,MSQL按照觸發(fā)器創(chuàng)建的順序進(jìn)行調(diào)度。要改變觸發(fā)器的執(zhí)行順序,可以在FOREACHROW子句后使用FOLLOWS或者PRECEDES。FOLLOWS表示新創(chuàng)建的觸發(fā)器后執(zhí)行,PRECEDES表示新創(chuàng)建的觸發(fā)器先執(zhí)行。相同事件觸發(fā)的多個(gè)觸發(fā)器中,無論觸發(fā)器的執(zhí)行順序是怎么樣的,只要有一個(gè)觸發(fā)器的條件不滿足,之前成功執(zhí)行的所有觸發(fā)器已經(jīng)執(zhí)行的操作都會(huì)回滾,之后的觸發(fā)器不在執(zhí)行,以此保持?jǐn)?shù)據(jù)一致性。9.4.2創(chuàng)建觸發(fā)器CREATETRIGGERoperationBEFOREINSERTONsalebillFOREACHROW UPDATEcardSETbalance=balance-NEW.payamount WHERECID=NEW.CID;

CREATETRIGGERoperation2BEFOREINSERTONsalebillFOREACHROWFOLLOWSoperationBEGIN DECLAREsCHAR(1); SELECTstateINTOsFROMcardwhereCID=NEW.CID; IFs='1'ORs='2'THENUPDATEcardSETs='3'WHERECID=NEW.CID; ENDIF;END;[例9-16]:刪除salebill表之前建立的觸發(fā)器,新建兩個(gè)前觸型觸發(fā)器operation和operation2,operation的效果如例[9-14],operation2保證只有正常狀態(tài),即state為0的校園卡可以消費(fèi)。9.4.2創(chuàng)建觸發(fā)器操作之前先查詢一下即將進(jìn)行操作的C00005校園卡的信息,如表右表所示。執(zhí)行操作:C00005校園卡消費(fèi)30元。INSERTINTOsalebill(CID,BID,payamount,saledate)VALUES('C00005','B003',30,'2020-8-10');SELECTCID,balanceFROMcardWHERECID='C00005';這個(gè)INSERT操作觸發(fā)了觸發(fā)器,滿足卡余額大于消費(fèi)數(shù)且此卡的state=0,兩個(gè)觸發(fā)器的條件都滿足,都可以成功執(zhí)行,C00005的余額被修改,結(jié)果如右表所示。SELECT*FROMcardWHERECID='C00005';執(zhí)行操作:C00005校園卡繼續(xù)消費(fèi)50元。INSERTINTOsalebill(CID,BID,payamount,saledate)VALUES('C00005','B003',50,'2020-8-10');執(zhí)行第一個(gè)觸發(fā)器時(shí),消費(fèi)金額大于卡余額,違反了card表的約束條件CHECKbalance>=0。觸發(fā)器執(zhí)行失敗。系統(tǒng)給出報(bào)錯(cuò)信息“3819-Checkconstraint'card_chk_1'isviolated”。9.4.3修改和刪除觸發(fā)器修改觸發(fā)器可以通過刪除原觸發(fā)器,再以相同的名稱創(chuàng)建新的觸發(fā)器。使用DROP語句刪除觸發(fā)器?;镜恼Z法格式為:DROPTRIGGER[IFEXISTS]trigger_name第10章數(shù)據(jù)庫備份與恢復(fù)本章介紹數(shù)據(jù)庫備份與恢復(fù)的基本概念以及MySQL提供的數(shù)據(jù)備份與數(shù)據(jù)恢復(fù)方法。數(shù)據(jù)庫系統(tǒng)原理及應(yīng)用10.1基本概念10.2邏輯備份與恢復(fù)10.4NavicatPremium操作主要內(nèi)容10.3表的導(dǎo)出與導(dǎo)入基本概念10.110.1基本概念數(shù)據(jù)庫故障的種類:1)操作系統(tǒng)崩潰;2)電源故障;3)文件系統(tǒng)崩潰;4)存儲(chǔ)介質(zhì)故障;5)服務(wù)器癱瘓;6)用戶誤操作;7)病毒破壞;8)自然災(zāi)害備份是指定期或不定期地對數(shù)據(jù)庫數(shù)據(jù)進(jìn)行復(fù)制??梢詮?fù)制到本地機(jī)器上,也可以復(fù)制到其它介質(zhì)上。是保證系統(tǒng)安全的一項(xiàng)重要措施。備份就是為了最大限度地降低災(zāi)難性數(shù)據(jù)丟失的風(fēng)險(xiǎn),從數(shù)據(jù)庫中定期保存用戶對數(shù)據(jù)庫所做的修改,用以將數(shù)據(jù)庫從錯(cuò)誤狀態(tài)下恢復(fù)到某一正確狀態(tài)的副本。使用數(shù)據(jù)管理管理軟件,比如NavicatPremium就提供了一套功能強(qiáng)大的、安全的數(shù)據(jù)備份和恢復(fù)工具,數(shù)據(jù)庫的備份和恢復(fù)可以在系統(tǒng)發(fā)生錯(cuò)誤的時(shí)候,搶救恢復(fù)以前的數(shù)據(jù)。10.1.1備份類型按數(shù)據(jù)庫備份的方法劃分:邏輯備份邏輯備份是指將數(shù)據(jù)庫中的數(shù)據(jù)按照預(yù)定義的邏輯格式,生成一組CREATEDATABASE、CREATETABLE等定義數(shù)據(jù)庫結(jié)構(gòu)的語句和INSERT、定界文本文件等定義數(shù)據(jù)庫內(nèi)容的語句。物理備份:物理備份是指備份時(shí)直接復(fù)制數(shù)據(jù)庫的數(shù)據(jù)文件。根據(jù)備份時(shí)數(shù)據(jù)服務(wù)是否在線可以把物理備份分為冷備份、熱備份和溫備份。冷備份:指在關(guān)閉MySQL服務(wù)器、停用數(shù)據(jù)庫的讀寫操作下所做的備份。熱備份:指在停用數(shù)據(jù)庫的寫入操作,但不停用讀操作的情況下進(jìn)行備份。溫備份:指在不停用數(shù)據(jù)庫所提供的數(shù)據(jù)服務(wù)的讀寫操作下所做的備份。10.1.1備份類型根據(jù)備份的數(shù)據(jù)集的范圍可以劃分全量備份:又稱為完全備份、完整備份、全備,指對數(shù)據(jù)庫中的全部信息進(jìn)行備份,包括數(shù)據(jù)庫的數(shù)據(jù)文件、日志文件、數(shù)據(jù)庫對象以及其它相關(guān)信息。特點(diǎn):消耗時(shí)間和資源增量備份:備份從最近的一次備份之后對數(shù)據(jù)所作的更新。優(yōu)點(diǎn):速度快,使備份一個(gè)數(shù)據(jù)庫需要的時(shí)間最小,因?yàn)樗獋浞莸臄?shù)據(jù)量比完全備份小得多。通過增加差異備份的備份次數(shù),可以降低丟失數(shù)據(jù)的風(fēng)險(xiǎn)。在MySQL中,第一次增量備份是基于全量備份的,之后的增量備份是基于最近一次的備份(可能是全量備份,也可能是增量備份)10.1.1備份類型事務(wù)日志備份:事務(wù)日志備份是對數(shù)據(jù)庫發(fā)生的事務(wù)進(jìn)行備份,它可以在相應(yīng)的數(shù)據(jù)庫備份的基礎(chǔ)上,盡可能的恢復(fù)最新的數(shù)據(jù)庫記錄。由于它僅對數(shù)據(jù)庫事務(wù)日志進(jìn)行備份,所以其需要的磁盤空間和備份時(shí)間都比數(shù)據(jù)庫備份少得多。執(zhí)行事務(wù)日志備份主要有兩個(gè)原因:1)是要在一個(gè)安全的介質(zhì)上存儲(chǔ)自上次事務(wù)日志備份或數(shù)據(jù)庫備份以來修改的數(shù)據(jù);2)是要合適地關(guān)閉事務(wù)日志到它的活動(dòng)部分的開始。10.1.2備份和恢復(fù)策略完整備份包括對數(shù)據(jù)和日志的備份特點(diǎn):適合數(shù)據(jù)庫數(shù)據(jù)量不是很大,數(shù)據(jù)更改不頻繁比如在每天0:00進(jìn)行一次完整備份的策略,如圖所示10.1.2備份和恢復(fù)策略完整備份加日志備份用戶不允許丟失太多數(shù)據(jù),而且又不希望經(jīng)常進(jìn)行完整備份,這時(shí)可以在完整備份中間加入若干次日志備份。

比如如圖所示,每天0:00進(jìn)行一次完整備份,再間隔幾小時(shí)進(jìn)行一次日志備份10.1.2備份和恢復(fù)策略完整備份加增量備份再加日志備份當(dāng)用戶希望將進(jìn)行完整備份的時(shí)間間隔再加大,如果還采用完整備份加日志備份的方法恢復(fù)起來比較耗時(shí)。在此種情況下可取完整備份加增量備份再加日志備份的策略比如每周的周日進(jìn)行一次完整備份。這種策略的優(yōu)勢是備份和恢復(fù)的速度都比較快,而且當(dāng)系統(tǒng)出現(xiàn)故障時(shí),丟失的數(shù)據(jù)也相對較少。10.1.2備份和恢復(fù)策略恢復(fù)數(shù)據(jù)庫時(shí)的順序:一般先恢復(fù)最近的完全備份然后按增量備份的先后順序恢復(fù)從最近的完全備份之后的所有增量備份。最后恢復(fù)日志備份邏輯備份與恢復(fù)10.210.2邏輯備份與恢復(fù)MySQL自帶的mysqldump工具、多線程備份工具mydumper,以及SELECT...INTOOUTFILE語句都可以實(shí)現(xiàn)邏輯備份。要恢復(fù)邏輯備份,可以使用MySQL客戶端處理SQL格式的備份文件、與mydumper配套的myloader工具,或者使用LOADDATAINFILE語句加載帶分隔符的文本格式的備份文件。10.2.1用mysqldump工具進(jìn)行邏輯備份mysqldump是MySQL自帶的數(shù)據(jù)庫邏輯備份工具,適用于所有的存儲(chǔ)引擎,支持溫備份,對于InnoDB存儲(chǔ)引擎支持熱備份。使用mysqldump可以備份一個(gè)數(shù)據(jù)庫,也可以備份多個(gè)數(shù)據(jù)庫或者備份所有數(shù)據(jù)庫。生成的備份文件可以是SQL格式的文件,也可以是帶分隔符的定界文本格式的文件,還可以是XML格式的文件。通常情況下,mysqldump是備份成后綴名為.sql的SQL格式的文件。mysqldump需要使用shell腳本。根據(jù)要備份的數(shù)據(jù)庫對象的不同,mysqldump語句有以下三種格式:(1)備份一個(gè)數(shù)據(jù)庫(2)備份多個(gè)數(shù)據(jù)庫(3)備份所有數(shù)據(jù)庫10.2.1用mysqldump工具進(jìn)行邏輯備份(1)備份一個(gè)數(shù)據(jù)庫語句的基本語法格式為:shell>mysqldump-u[uname]-p[pass]dbtb1tb2>dump.sql參數(shù):(1)-u[uname]-p[pass]:連接MySQL的用戶名和密碼。在shell腳本中輸入密碼時(shí)屏幕上不顯示任何信息,不會(huì)出現(xiàn)“*”或其他符號(hào),只要密碼輸入正確就可以了。(2)db:需要備份的表所在的數(shù)據(jù)庫的名稱。(3)tb1tb2:需要備份的表的名稱。沒有該參數(shù)時(shí)將備份整個(gè)數(shù)據(jù)庫。(4)dump.sql:SQL格式的備份文件的名稱。文件名前可加上絕對路徑。10.2.1用mysqldump工具進(jìn)行邏輯備份[例10-1]:以root用戶身份備份校園卡管理數(shù)據(jù)庫cardmanagement中的salebill表,備份文件名保存在指定目錄(此處以筆者的電腦桌面文件夾示例,讀者根據(jù)實(shí)際情況設(shè)定目錄),備份文件名稱為salebill.sql。打開終端(Terminal),輸入如下語句:mysqldump-uroot-pcardmanagementsalebill>'/Users/zqf/Desktop/salebill.sql'10.2.1用mysqldump工具進(jìn)行邏輯備份2)備份多個(gè)數(shù)據(jù)庫mysqldump語句的--databases選項(xiàng)用于備份多個(gè)數(shù)據(jù)庫,其基本的語法格式為:shell>mysqldump--databasesdb1db2db3>dump.sql參數(shù):--databasesdb1db2db3:--databases后的所有名稱都被視為數(shù)據(jù)庫名稱。只備份一個(gè)數(shù)據(jù)庫的情況下,可以省略--databases選項(xiàng)。省略--databases的情況下,備份文件中不包含CREATEDATABASE和USE語句。使用--databases選項(xiàng)時(shí),mysqldump在每個(gè)數(shù)據(jù)庫的備份文件之前寫入CREATEDATABASE和USE語句,以確保在重新加載備份文件時(shí),如果不存在數(shù)據(jù)庫,將先創(chuàng)建數(shù)據(jù)庫并將其設(shè)置為默認(rèn)數(shù)據(jù)庫,以便將數(shù)據(jù)庫內(nèi)容加載到備份時(shí)的同名數(shù)據(jù)庫中。如果使用--add-drop-database選項(xiàng),mysqldump還在每個(gè)CREATEDATABASE語句之前寫入DROPDATABASE語句,在加載備份文件重新創(chuàng)建數(shù)據(jù)庫之前強(qiáng)制刪除數(shù)據(jù)庫。10.2.1用mysqldump工具進(jìn)行邏輯備份[例10-2]:使用root用戶備份cardmanagement數(shù)據(jù)庫和mysql數(shù)據(jù)庫,備份文件名為backup.sql。打開終端,輸入如下mysqldump語句:mysqldump-uroot-p--databasescardmanagementmysql>'/Users/zqf/Desktop/backup.sql'10.2.1用mysqldump工具進(jìn)行邏輯備份3)備份所有數(shù)據(jù)庫mysqldump語句的--all-databases選項(xiàng)用于備份所有數(shù)據(jù)庫,其基本的語法格式為:shell>mysqldump[--all-databases]>dump.sql參數(shù):[--all-databases]:省略該選項(xiàng)的情況下,備份文件中不包含CREATEDATABASE和USE語句。例10-3:使用root用戶備份所有數(shù)據(jù)庫,備份文件名為all.sql。mysqldump-u-root-p--all-databases>'/Users/zqf/Desktop/all.sql'10.2.2加載SQL格式的備份文件恢復(fù)數(shù)據(jù)庫1)用mysql語句恢復(fù)數(shù)據(jù)庫使用mysql語句直接在終端加載備份文件,其基本的語法格式為:shell>mysql-u[uname]-p[pass]<dump.sql[例10-4]:恢復(fù)cardmanagement數(shù)據(jù)庫中的salebill表。在終端輸入命令:mysql-uroot-pcardmanagement</Users/zqf/Desktop/salebill.sql按照提示輸入連接數(shù)據(jù)庫的密碼,輸入密碼后將完成數(shù)據(jù)恢復(fù)。10.2.2加載SQL格式的備份文件恢復(fù)數(shù)據(jù)庫2)用source語句恢復(fù)數(shù)據(jù)庫在MySQL內(nèi)部使用source語句加載備份文件,其基本的操作步驟是:(1)打開終端后,先連接MySQL。基本的語法格式為:mysql-u[uname]-p[pass](2)如果要恢復(fù)的數(shù)據(jù)庫不存在,需要先創(chuàng)建同名數(shù)據(jù)庫,并切換為當(dāng)前數(shù)據(jù)庫。基本的語法格式為:CREATEDATABASEdb;USEdb;(3)使用source語句加載備份文件?;镜恼Z法格式為:sourcedump.sql10.2.2加載SQL格式的備份文件恢復(fù)數(shù)據(jù)庫[例10-5]:恢復(fù)cardmanagement數(shù)據(jù)庫中的salebill表。(1)打開終端,按照提示輸入連接數(shù)據(jù)庫的密碼,進(jìn)入MySQL環(huán)境:

mysql-uroot-p(2)在MySQL環(huán)境下,把cardmanagement數(shù)據(jù)庫切換為當(dāng)前數(shù)據(jù)庫:

usecardmanagement(3)恢復(fù)salebill表:

source/Users/zqf/Desktop/salebill.sql[例10-6]:重新加載backup.sql,恢復(fù)cardmanagement數(shù)據(jù)庫和mysql數(shù)據(jù)庫。shell>mysql-uroot-p<backup.sql或者在MySQL環(huán)境下,執(zhí)行sourcebackup.sql表的導(dǎo)出與導(dǎo)入10.310.3.1用SELECT......INTOOUTFILE語句導(dǎo)出文本文件SELECT......INTOOUTFILE語句可用于將表的內(nèi)容導(dǎo)出為一個(gè)文本文件轉(zhuǎn)儲(chǔ)到服務(wù)器上,并且導(dǎo)出文件不能已存在。其基本的語法格式為:SELECTselect_expr[,select_expr]...INTOOUTFILE'file_name'[FIELDSTERMINATEDBY'string'][FIELDSENCLOSEDBY'char'][FIELDSESCAPEDBY'char'][LINESSTARTINGBY'string'][LINESTERMINATEDBY'string']10.3.1用SELECT......INTOOUTFILE語句導(dǎo)出文本文件參數(shù):(1)SELECT子句:查詢需要備份的數(shù)據(jù)。(2)file_name:存放輸出數(shù)據(jù)的文件名。(3)FIELDSTERMINATEDBY'string':設(shè)置字段之間的分隔符,可以為單個(gè)或多個(gè)字符。默認(rèn)值是“\t”。(4)FIELDSENCLOSEDBY'char':設(shè)置字符來括住字段的值,只能為單個(gè)字符。默認(rèn)情況下不使用任何符號(hào)。(5)FIELDSESCAPEDBY'char':設(shè)置轉(zhuǎn)義字符,只能為單個(gè)字符。默認(rèn)值為“\”。(6)LINESSTARTINGBY'string':設(shè)置每行數(shù)據(jù)開頭的字符,可以為單個(gè)或多個(gè)字符。默認(rèn)情況下不使用任何字符。(7)LINESTERMINATEDBY'string':設(shè)置每行數(shù)據(jù)結(jié)尾的字符,可以為單個(gè)或多個(gè)字符。默認(rèn)值是“\n”。(8)FIELDS和LINES兩個(gè)子句都是自選的,但是如果兩個(gè)子句都被指定了,F(xiàn)IELDS必須位于LINES的前面。10.3.1用SELECT......INTOOUTFILE語句導(dǎo)出文本文件[例10-7]:把student表的數(shù)據(jù)備份到桌面的studen

溫馨提示

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

最新文檔

評論

0/150

提交評論