mysql怎么存儲(chǔ)得 mysql怎么存數(shù)據(jù)

五、MYSQL存儲(chǔ)過程和函數(shù)

? create procedure用來(lái)創(chuàng)建 存儲(chǔ)過程 ,create function用來(lái)創(chuàng)建 函數(shù)

10余年的攸縣網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷型網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整攸縣建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“攸縣網(wǎng)站設(shè)計(jì)”,“攸縣網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

? Delimiter命令是改變語(yǔ)句的結(jié)束符 ,MySQL默認(rèn)的結(jié)束符為;號(hào),由于procedure和function中的;號(hào)并不代表創(chuàng)建的結(jié)束,所以要替換成另外的結(jié)束符以便表示創(chuàng)建的結(jié)束

? rontine_body子句可以包含一個(gè)簡(jiǎn)單的SQL語(yǔ)句,也可以包含多個(gè)SQL語(yǔ)句, 通過begin…end將這多個(gè)SQL語(yǔ)句 包含在一起

? MySQL存儲(chǔ)過程和函數(shù)中也可以包含類似create和drop等DDL語(yǔ)句

? comment子句用來(lái)寫入對(duì)存儲(chǔ)過程和函數(shù)的注釋

? Language子句用來(lái)表示此存儲(chǔ)過程和函數(shù)的創(chuàng)建語(yǔ)言

? 存儲(chǔ)過程和函數(shù)被標(biāo)注為deterministic表明當(dāng)輸入相同的參數(shù)是會(huì)返回相同的結(jié)果,反之如果是not deterministic則表示相同參數(shù)不會(huì)是相同結(jié)果,默認(rèn)是not deterministic

? 相關(guān)屬性短語(yǔ)只有咨詢含義,并不是強(qiáng)制性的約束

? Drop procedure/function語(yǔ)句用來(lái) 刪除指定名稱的存儲(chǔ)過程或函數(shù)

? Begin…end語(yǔ)句通常出現(xiàn)在存儲(chǔ)過程、函數(shù)和觸發(fā)器中,其中 可以包含一個(gè)或多個(gè)語(yǔ)句 ,每個(gè)語(yǔ)句用;號(hào)隔開

? 標(biāo)簽label可以加在begin…end語(yǔ)句以及l(fā)oop, repeat和while語(yǔ)句

? 語(yǔ)句中通過iterate和leave來(lái)控制流程,iterate表示返回指定標(biāo)簽位置,leave表示跳出標(biāo)簽

? Declare語(yǔ)句通常用來(lái)聲明本地變量、游標(biāo)、條件或者h(yuǎn)andler

? Declare語(yǔ)句只允許出現(xiàn)在begin … end語(yǔ)句中而且必須出現(xiàn)在第一行

? Declare的順序也有要求,通常是先聲明本地變量,再是游標(biāo),然后是條件和handler

? 本地變量可以通過declare語(yǔ)句進(jìn)行聲明

? 聲明后的變量可以通過select … into var_list進(jìn)行賦值,或者通過set語(yǔ)句賦值,或者通過定義游標(biāo)并使用fetch … into var_list賦值

? 通過declare聲明變量方法:

? MySQL支持if,case,iterate,leave,loop,while,repeat語(yǔ)句作為存儲(chǔ)過程和函數(shù)中的 流程控制語(yǔ)句 ,另外return語(yǔ)句也是函數(shù)中的特定流程控制語(yǔ)句

? Case語(yǔ)句在存儲(chǔ)過程或函數(shù)中表明了 復(fù)雜的條件選擇語(yǔ)句

? IF語(yǔ)句在存儲(chǔ)過程或函數(shù)中表明了 基礎(chǔ)的條件選擇語(yǔ)句

其中在 function 里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我們開啟了 bin-log, 我們就必須為我們的 function 指定一個(gè)參數(shù)。

在 MySQL 中創(chuàng)建函數(shù)時(shí)出現(xiàn)這種錯(cuò)誤的解決方法:

set global log_bin_trust_function_creators=TRUE;

? Iterate語(yǔ)句 僅出現(xiàn)在loop,repeat,while循環(huán)語(yǔ)句中,其含義表示重新開始此循環(huán)

? Leave語(yǔ)句表明 退出指定標(biāo)簽的流程控制語(yǔ)句塊

? 通常會(huì)用在begin…end,以及l(fā)oop,repeat,while的循環(huán)語(yǔ)句中

? Loop語(yǔ)句是存儲(chǔ)過程或函數(shù)中表達(dá) 循環(huán)執(zhí)行 的一種方式

? repeat語(yǔ)句是存儲(chǔ)過程或函數(shù)中表達(dá) 循環(huán)執(zhí)行 的一種方式

? while語(yǔ)句是存儲(chǔ)過程或函數(shù)中表達(dá) 循環(huán)執(zhí)行 的一種方式

? Return語(yǔ)句用在 函數(shù)中,用來(lái)終結(jié)函數(shù)的執(zhí)行并將指定值返回給調(diào)用者

? Cursor游標(biāo)用來(lái) 聲明一個(gè)數(shù)據(jù)集

? 游標(biāo)的聲明必須在變量和條件聲明之后,在handler聲明之前

? Cursor close語(yǔ)句用來(lái) 關(guān)閉之前打開的游標(biāo)

? Cursor declare語(yǔ)句用來(lái)聲明一個(gè)游標(biāo)和指定游標(biāo)對(duì)應(yīng)的數(shù)據(jù)集合, 通常數(shù)據(jù)集合是一個(gè)select語(yǔ)句

? Cursor fetch語(yǔ)句用來(lái)獲取游標(biāo)指定數(shù)據(jù)集的 下一行數(shù)據(jù) 并將各個(gè)字段值賦予后面的變量

? Open cursor語(yǔ)句用來(lái)打開一個(gè)之前已經(jīng) 聲明好的游標(biāo)

? Declare condition語(yǔ)句命名 特定的錯(cuò)誤條件 ,而該特定錯(cuò)誤可以在declare…h(huán)andler中指定 處理方法

? 比如在MySQL中1051error code表示的是unknown table的錯(cuò)誤,如果要對(duì)這

個(gè)錯(cuò)誤做特殊處理,可以用三種方法:

? Declare handler語(yǔ)句用來(lái)聲明一個(gè)handler來(lái)處理一個(gè)或多個(gè)特殊條件,當(dāng)其中的某個(gè)條件滿足時(shí)則觸發(fā)其中的statement語(yǔ)句執(zhí)行

? Statement可以是一個(gè)簡(jiǎn)單SQL語(yǔ)句,也可以是begin…end組成的多個(gè)語(yǔ)句

? Handler_action子句聲明當(dāng)執(zhí)行完statement語(yǔ)句之后應(yīng)該怎么辦

Condition_value的值有以下幾種:

? 當(dāng)condition發(fā)生但沒有聲明handler時(shí),則存儲(chǔ)過程和函數(shù)依照如下規(guī)則處理

? create trigger語(yǔ)句用來(lái)創(chuàng)建一個(gè)觸發(fā)器,觸發(fā)器的作用是當(dāng)表上有對(duì)應(yīng)SQL語(yǔ)句發(fā)生時(shí),則觸發(fā)執(zhí)行

? 觸發(fā)器創(chuàng)建時(shí)需要 指定對(duì)應(yīng)的表名 tbl_name

? Definer關(guān)鍵詞用來(lái)指定trigger的安全環(huán)境

? Trigger_time指定觸發(fā)器的執(zhí)行時(shí)間,BEFORE和AFTER指定觸發(fā)器在表中的 每行數(shù)據(jù)修改前或者后 執(zhí)行

? Trigger_event指定觸發(fā)該觸發(fā)器的具體 事件

? INSERT當(dāng)新的一行數(shù)據(jù)插入表中時(shí)觸發(fā),比如通過執(zhí)行insert,load data,replace語(yǔ)句插入新數(shù)據(jù)

? UPDATE當(dāng)表的一行數(shù)據(jù)被修改時(shí)觸發(fā),比如執(zhí)行update語(yǔ)句時(shí)

? DELETE當(dāng)表的一行數(shù)據(jù)被刪除時(shí)觸發(fā),比如執(zhí)行delete,replace語(yǔ)句時(shí)

? 當(dāng)執(zhí)行insert into … on duplicate key update語(yǔ)句時(shí),當(dāng)碰到重復(fù)行執(zhí)行update時(shí),則觸發(fā)update下的觸發(fā)器

? 從5.7.2版本開始,可以創(chuàng)建具有相同trigger_time和trigger_event的同一個(gè)表上的多個(gè)觸發(fā)器,默認(rèn)情況下按照創(chuàng)建的時(shí)間依次執(zhí)行,通過 指定FOLLOWS/PRECEDES改變執(zhí)行順序 ,即FOLLOWS時(shí)表示新創(chuàng)建的觸發(fā)器后執(zhí)行,PRECEDES則表示新觸發(fā)器先執(zhí)行

? Trigger_body表示觸發(fā)器觸發(fā)之后要執(zhí)行的一個(gè)或多個(gè)語(yǔ)句,在內(nèi)部可以引用涉及表的字段, OLD.col_name表示行數(shù)據(jù)被修改或刪除之前的字段數(shù)據(jù),NEW.col_name表示行數(shù)據(jù)被插入或修改之后的字段數(shù)據(jù)

? Drop trigger語(yǔ)句用來(lái) 刪除一個(gè)觸發(fā)器

? If exists短語(yǔ)用來(lái)避免刪除不存在的觸發(fā)器時(shí)引發(fā)報(bào)錯(cuò)

? 當(dāng)你執(zhí)行drop table時(shí),表上的觸發(fā)器也被drop掉了

mysql是怎么做數(shù)據(jù)存儲(chǔ)的

1,每個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè)文件夾,文件夾名和庫(kù)名相同;

2,(單獨(dú)的表空間中) 每張表對(duì)應(yīng)幾個(gè)文件,文件名和表名相同,innodb引擎中對(duì)應(yīng)兩個(gè)文件,后綴名為:frm、ibd;

frm文件:存儲(chǔ)的是表結(jié)構(gòu)信息。

ibd文件:存儲(chǔ)的是表里的數(shù)據(jù)、索引等。

MySQL存儲(chǔ)過程二

上一節(jié)存儲(chǔ)過程封裝的都是簡(jiǎn)單的select語(yǔ)句,直接使用被封裝的語(yǔ)句就能完成。所以存儲(chǔ)過程往往應(yīng)用于更復(fù)雜的業(yè)務(wù)規(guī)則處理時(shí)更有效

看一個(gè)例子

這個(gè)例子使用元素比較多,解釋一下:

COMMENT為表添加了一句注釋;

-- 單行注釋,注釋跟在后面的內(nèi)容,需要注意-- 后需要加一個(gè)空格才能生效;

(#注釋內(nèi)容? ? ? ? /*注釋內(nèi)容*/? 這兩種方法也能進(jìn)行注釋)

Declare用來(lái)聲明變量,一句declare只能聲明一個(gè)變量,變量必須先聲明后使用

If...Then是進(jìn)行條件判斷的,基本語(yǔ)句如下:

If ... Then ... Else ... End If;

這個(gè)存儲(chǔ)過程完成了訂單合計(jì),并判斷該訂單是否需要增加營(yíng)業(yè)稅。taxable是一個(gè)布爾值(如果要增稅為真,否則為假)。在存儲(chǔ)體中定義了兩個(gè)局部變量。并將結(jié)果存儲(chǔ)到局部變量total中。if語(yǔ)句檢查taxable是否為真,如果為真,則用另一條select語(yǔ)句增加營(yíng)業(yè)稅。最后將total結(jié)果保存到ototal中。

調(diào)用結(jié)果如下:

檢查存儲(chǔ)過程

SHOW? CREATE? PROCEDURE? 過程名;

為了獲得包括何時(shí)、由誰(shuí)創(chuàng)建等詳細(xì)信息的存儲(chǔ)過程列表,使用

Show procedure status;? -- 會(huì)列出所有存儲(chǔ)過程

可以添加過濾,比如

存儲(chǔ)過程循環(huán)語(yǔ)句

1. while

WHILE (表達(dá)式)? DO?

...

END WHILE;

看一個(gè)例子

創(chuàng)建了一個(gè)循環(huán)存儲(chǔ)過程,重復(fù)向human插入5條記錄。下面調(diào)用看一下結(jié)果

2.repeat

基本語(yǔ)句:

Repeat ...until 條件...END? Repeat;

同樣操作,使用repeat執(zhí)行如下

網(wǎng)站名稱:mysql怎么存儲(chǔ)得 mysql怎么存數(shù)據(jù)
文章鏈接:http://m.kartarina.com/article44/dodesee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版網(wǎng)頁(yè)設(shè)計(jì)公司云服務(wù)器品牌網(wǎng)站建設(shè)微信小程序虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
主站蜘蛛池模板: 中文无码成人免费视频在线观看| 亚洲国产精品无码成人片久久| 亚洲AV无码不卡在线播放| 国产激情无码一区二区| 人妻丰满熟妇无码区免费| 精品久久久久久无码中文野结衣| 国产亚洲情侣一区二区无码AV | 亚洲动漫精品无码av天堂| 日本无码WWW在线视频观看| r级无码视频在线观看| 亚洲av无码久久忘忧草| 久久伊人中文无码| 无码人妻啪啪一区二区| 无码中文人妻在线一区二区三区| 久久久久亚洲精品无码网址| 亚洲AV无码AV吞精久久| 无码137片内射在线影院| YW尤物AV无码国产在线观看| 精品久久久久久无码中文字幕一区| 亚洲av无码无在线观看红杏| 亚洲国产精品成人AV无码久久综合影院 | 性虎精品无码AV导航| 亚洲日韩精品一区二区三区无码 | 亚洲色无码专区在线观看| 无码人妻H动漫中文字幕 | 国产精品久久久久无码av | 亚洲中文无码卡通动漫野外| 亚洲av无码一区二区三区乱子伦 | 精品久久久久久无码人妻热| 岛国av无码免费无禁网站| 亚洲乱亚洲乱妇无码| 亚洲中文无码a∨在线观看| 无码视频一区二区三区在线观看| 国产亚洲精品a在线无码| 岛国无码av不卡一区二区| 中文字幕人妻无码专区| 中文字幕精品无码一区二区三区| 亚洲熟妇少妇任你躁在线观看无码 | 粉嫩高中生无码视频在线观看| 亚洲AⅤ无码一区二区三区在线| 国产品无码一区二区三区在线|