MySQL中引入存储引擎意义是_mysql学习九:存储引擎、存储过程和函数的引入
存儲(chǔ)引擎:
存儲(chǔ)引擎是mysql特有的,共有7種,常用的有myisam、memory、innodb
查看表的存儲(chǔ)引擎:
show create table 表名;
修改表的存儲(chǔ)引擎:
alter table 表名 engine=存儲(chǔ)引擎名稱;
1.myisam存儲(chǔ)引擎:可轉(zhuǎn)換為壓縮只讀表來節(jié)省空間
使用三個(gè)文件表示每個(gè)表:
格式文件--存儲(chǔ)表的結(jié)構(gòu)? 表名.frm
數(shù)據(jù)文件---存儲(chǔ)表的數(shù)據(jù)? 表名.MYD
索引文件--存儲(chǔ)表的索引 表名.MYI
2.innodb存儲(chǔ)引擎的特征:
每個(gè)innodb表,在數(shù)據(jù)庫目錄中以.frm格式文件表示
innodb表空間tablespace被用于存儲(chǔ)表的內(nèi)容
提供一組用來記錄事務(wù)性活動(dòng)的日志文件
用commit提交、savepoint 及rollback(回滾)支持事務(wù)處理
提供全部acid兼容
在mysql服務(wù)器崩潰后,提供自動(dòng)恢復(fù)
多版本mvcc和行級(jí)鎖
支持外鍵,及引用的完整性,包括級(jí)聯(lián)更新和刪除
3.memory存儲(chǔ)引擎,以前被稱為headp引擎
使用memory存儲(chǔ)引擎的表,因?yàn)閿?shù)據(jù)存儲(chǔ)在內(nèi)存中,且行的長度固定,所以使得memory存儲(chǔ)引擎非常快
memory存儲(chǔ)引擎管理的表具有下列特征
在數(shù)據(jù)庫目錄內(nèi),每個(gè)表均以.frm格式文件表示
表數(shù)據(jù)及索引被存儲(chǔ)在內(nèi)存中
表級(jí)鎖機(jī)制
字段屬性不能包含text或blob字段
選擇合適的存儲(chǔ)引擎:
myisam表最適合于大量的數(shù)據(jù)讀而少量數(shù)據(jù)更新的混合操作。myisam表的另一種適用情形是使用壓縮的只讀表。
如果查詢中包含較的數(shù)據(jù)更新操作,應(yīng)使用innodb。其行級(jí)鎖機(jī)制和多版本的支持為數(shù)據(jù)讀取和更新的混合提供了良好的并發(fā)機(jī)制。
使用memory存儲(chǔ)引擎存儲(chǔ)非永久需要的數(shù)據(jù),或者是能夠從基于磁盤的表中重新生成的數(shù)據(jù)。
存儲(chǔ)過程和函數(shù),是在數(shù)據(jù)庫中定義一些SQL語句的集合,然后直接調(diào)用這些存儲(chǔ)過程和函數(shù)來執(zhí)行已經(jīng)定義好的sql語句。
存儲(chǔ)過程和函數(shù),可以避免開發(fā)人員重復(fù)的編寫相同的sql語句;而且,存儲(chǔ)過程和函數(shù)是在mysql服務(wù)器中存儲(chǔ)和執(zhí)行的,可以減少客戶端和服務(wù)端的數(shù)據(jù)傳輸;
一、創(chuàng)建存儲(chǔ)過程和存儲(chǔ)函數(shù)
1.創(chuàng)建存儲(chǔ)過程
create procedure 存儲(chǔ)過程的名稱 ([proc_parameter[,......]]) [characteristic......] routine_body
proc_parameter:表示存儲(chǔ)過程的參數(shù)列表;由3分部分組成,輸入輸出類型、參數(shù)名和參數(shù)類型---[in | out | inout] param_name type
其中,in表示輸入?yún)?shù);out表示輸出參數(shù);inout表示既可以是輸入,也可以是輸出
param_name,是存儲(chǔ)過程的參數(shù)的名稱
type:指定存儲(chǔ)過程的參數(shù)類型,該類型可以是mysql數(shù)據(jù)庫的任意數(shù)據(jù)類型
characteristic:指定存儲(chǔ)過程的特性、配置;有多個(gè)可取值
language sql:說明 routine_body部分是由sql語言的語句組成,這也是數(shù)據(jù)庫系統(tǒng)默認(rèn)的語言
[not] deterministic:指明存儲(chǔ)過程的執(zhí)行結(jié)果是否是確定的。deterministic表明每次執(zhí)行存儲(chǔ)過程時(shí),相同的輸入會(huì)得到相同的輸出。not deterministic表示結(jié)果是非確定的,相同的輸入可能得到不同的輸出。默認(rèn)情況下,結(jié)果是非確定的。
{contains sql | no sql | reads sql data | modifies sql data }:指明子程序使用sql語句的限制
contains sql表示子程序包含sql語句;
no sql表示子程序中不包含sql語句
reads sql data表示子程序中包含讀數(shù)據(jù)的語句
modifies sql data表示子程序中包含寫數(shù)據(jù)的語句
默認(rèn)情況下,系統(tǒng)會(huì)指定為contains sql
sql security {definer |invoker}:指明誰有權(quán)限來執(zhí)行。definer表示只有定義者自己才能夠執(zhí)行;invoker表示調(diào)用者可以執(zhí)行。默認(rèn)情況下,系統(tǒng)指定的權(quán)限是definer。
comment "string":注釋信息
routine_boy:是sql代碼的內(nèi)容,可以用begin......end來標(biāo)志sql代碼的開始和結(jié)束。如果bign,end中有多條語句,則要在begin,end的前后再加上delimiter |......| delimiter
delimiter &&
CREATE PROCEDURE pro_book ( IN bt INT, OUT count_num INT) READS SQL DATABEGIN
SELECT COUNT(*) FROM book WHERE bookTypeId=bt;END &&delimiter;
調(diào)用存儲(chǔ)過程:1,是輸入的參數(shù);@total是輸出的參數(shù);@表示定義的是全局參數(shù)
call pro_book(1, @total);
2.創(chuàng)建存儲(chǔ)函數(shù)
create function 存儲(chǔ)函數(shù)的名稱 ([func_parameter[,......]])
returns type [characteristic....] routine_body;
func_parameter:存儲(chǔ)函數(shù)的參數(shù)列表。可以由多個(gè)參數(shù)組成,每個(gè)參數(shù)由參數(shù)名稱和參數(shù)類型組成,形式如下:
param_name type:其中,param_name參數(shù)是存儲(chǔ)函數(shù)的參數(shù)名稱;type參數(shù)是指定存儲(chǔ)函數(shù)的參數(shù)類型,該類型可以是mysql數(shù)據(jù)庫的任意數(shù)據(jù)類型
returns type:指定返回值的類型
characteristic:指定存儲(chǔ)過程的特性,該參數(shù)的取值與存儲(chǔ)過程中的聚會(huì)是一樣的
routine_body:是sql的代碼內(nèi)容,可以用begin....end來標(biāo)志sql代碼的開始和結(jié)束
delimiter &&
CREATE FUNCTION func_book ( bookId INT ) RETURNS VARCHAR ( 20)BEGIN
RETURN ( SELECT bookName FROM book WHERE id =bookId );END &&delimiter;
調(diào)用存儲(chǔ)函數(shù):
select func_book(1);select func_book(2);
3.變量的使用
1.)定義變量
declare 變量名稱[,...] type [default value]
創(chuàng)建示例表:
create table test_user(id int not null auto_increment primary key,
userNamevarchar(20),
passwordvarchar(64)
)
創(chuàng)建存儲(chǔ)過程,定義變量:
delimiter &&
CREATE PROCEDURE pro_user ( ) BEGIN
DECLARE a,b VARCHAR ( 20);INSERT INTO test_user values(null, a, b );END &&delimiter;
調(diào)用存儲(chǔ)過程:
call pro_user();
調(diào)用存儲(chǔ)過程的結(jié)果:
2).為變量賦值
set 變量名=expr[, 變量名=expr].........
創(chuàng)建存儲(chǔ)過程,定義變量,給變量賦值:
delimiter &&
CREATE PROCEDUREpro_user2 ( )BEGIN
DECLARE a,b VARCHAR ( 20);set a='java123',b='1234235';INSERT INTO test_user values(null, a, b );END &&delimiter;
調(diào)用存儲(chǔ)過程:
call pro_user2;
另一種賦值方式: select ..... into 變量名
delimiter &&
CREATE PROCEDUREpro_user3 ( )BEGIN
DECLARE a,b VARCHAR ( 20);SELECT userName, password INTO a,b FROM test_user where id=1;INSERT INTO test_user values(null, a, b );END &&delimiter;
call pro_user3;
4.游標(biāo)的使用
查詢語句可能查詢出多條記錄,在存儲(chǔ)過程和存儲(chǔ)函數(shù)中使用游標(biāo)來逐條讀取查詢結(jié)果集中的記錄。
游標(biāo)的使用,包括聲明游標(biāo)、打開游標(biāo)、使用游標(biāo)和關(guān)閉游標(biāo)。
游標(biāo)必須聲明在處理程序之前,并且聲明在變量和條件之后。
1).聲明游標(biāo):
declare 游標(biāo)名稱 cursor for select查詢語句;
2).打開游標(biāo)
open 游標(biāo)名稱;
3).使用游標(biāo)
fetch 游標(biāo)名稱 into 變量名稱[,變量名稱......]
創(chuàng)建存儲(chǔ)過程,定義變量,定義打開使用關(guān)閉游標(biāo):使用游標(biāo)查詢的結(jié)果,賦值給變量
delimiter &&
CREATE PROCEDUREpro_user4 ( )BEGIN
DECLARE a,b VARCHAR ( 20);DECLARE cur_test_user CURSOR FOR SELECT userName,password FROM test_user where id=2;OPENcur_test_user;FETCH cur_test_user INTOa, b;INSERT INTO test_user values(null, a, b );CLOSEcur_test_user;END &&delimiter;
調(diào)用存儲(chǔ)過程:
call pro_user4;
5.流程的控制
存儲(chǔ)過程和存儲(chǔ)函數(shù)中,可以使用流程控制來控制語句的執(zhí)行。
mysql中,可以使用if、case、loop、leave、iterate、repeat、while語句來控制流程
1).IF語句
IF search_condition THENstatement_list[ELSEIF search_condition THEN statement_list]........[ELSE statement_list]
END IF
示例:
delimiter &&
CREATE PROCEDURE pro_user5 (in id int)BEGIN
SELECT count(*) INTO @numm from user1 WHERE id=id;IF @num > 0 THEN UPDATE user1 SET userName='java12345' WHERE id=id;ELSE
INSERT INTO user1 VALUES(null, 'java12345', '123123');END IF;END &&delimiter;
call pro_user5(5);
call pro_user5(5);
2).CASE語句
CASEcase_valueWHEN when_value THENstatement_list[WHEN when_value THEN statement_list]......[ELSE statement_list]
END CASE
示例:
delimiter &&
CREATE PROCEDURE pro_user6 (in id int)BEGIN
SELECT count(*) INTO @numm from user1 WHERE id=id;CASE @num
WHEN 1 THEN UPDATE user1 SET userName='python123' where id=id;WHEN 2 THEN INSERT INTO user1 VALUES(null,'python123', '123456');ELSE INSERT INTO user1 VALUES(null, 'JS123', '1111111');END CASE;END &&delimiter;
call pro_user6(5);
3).LOOP、LEAVE語句
LOOP語句可以使某些特定的語句重復(fù)執(zhí)行,實(shí)現(xiàn)一個(gè)簡單的循環(huán)。
但是LOOP語句本身沒有停止循環(huán)的語句,必須遇到LEAVE語句等,才會(huì)停止。
[begin_label:]LOOP
statement_listEND LOOP [end_label]
示例:
delimiter &&
CREATE PROCEDURE pro_user7 (in totalNum int)BEGINaaaLable:LOOPIF totalNum=0 THENLEAVE aaaLable;ELSE INSERT INTO user1 VALUES (totalNum, '123', '123');END IF;SET totalNum=totalNum-1;ENDLOOP aaaLable;END &&delimiter;
call pro_user7(10);
4.ITERATE語句:也是用來跳出循環(huán)。但是,ITERATE語句是跳出本次循環(huán),然后直接進(jìn)入下一次循環(huán)。相當(dāng)于,continue
ITERATE label;
delimiter &&
CREATE PROCEDURE pro_user8 (in totalNum int)BEGINaaaLable:LOOPSET totalNum=totalNum-1;IF totalNum=0 THENLEAVE aaaLable;
ELSEIF totalNum=3 THENITERATE aaaLable;END IF;INSERT INTO user1 VALUES (totalNum, '123456', '123456');ENDLOOP aaaLable;END &&delimiter;
call pro_user8(11);
5.REPEAT語句:是有條件控制的循環(huán)語句。當(dāng)滿足特定條件時(shí),就會(huì)跳出循環(huán)語句。
[label:]REPEAT
statement_list
UNTIL search_conditionEND REPEAT [label]
delimiter &&
CREATE PROCEDURE pro_user9 (in totalNum int)BEGINaaaLable:REAPEATSET totalNum=totalNum-1;INSERT INTO user1 VALUES (totalNum, '111', '111');
UNTIL totalNum=1;ENDREPEAT aaaLable;END &&delimiter;
6.WHILE語句
[label:] WHILEsearch_condition DO
statement_list
END WHILE [label]
示例:
delimiter &&
CREATE PROCEDURE pro_user10 (in totalNum int)BEGIN
WHILE totalNum > 0DOINSERT INTO user1 VALUES (totalNum, '111', '111');SET totalNum=totalNum-1;END WHILE;END &&delimiter;
call pro_user10(10);
二、調(diào)用存儲(chǔ)過程和函數(shù)
1.調(diào)用存儲(chǔ)過程
call 存儲(chǔ)過程的名稱([parameter[,........]);
2.調(diào)用存儲(chǔ)函數(shù)
call 存儲(chǔ)函數(shù)的名稱([parameter[,........]);
三、查看存儲(chǔ)過程和函數(shù)
1 show status:查看存儲(chǔ)過程和函數(shù)的狀態(tài)
show {procedure|function} status [like 'pattern'];
2.show create:查看存儲(chǔ)過程的函數(shù)的定義
show create {procedure|function} 存儲(chǔ)函數(shù)的名稱;
3.從information_schema.Routins表中,查看存儲(chǔ)過程和函數(shù)的信息
四、修改存儲(chǔ)過程和函數(shù)
alter {procedure|function} 名稱 [characteristic.......]
characteristic:
contains sql | no sql | reads sql data | modifies sql data
| sql security {definer | invoker}
|comment 'string'
contains sql:表示子程序包含sql讀或?qū)懻Z句,默認(rèn)值
no sql:表示子程序中不包含sql語句
reads sql data:表示子程序中包含讀數(shù)據(jù)的語句
modifies sql data:表示子特別子程序中包含寫數(shù)據(jù)的語句
sql security {definer | invoker}:指明誰有權(quán)限執(zhí)行
definer---表示只有定義者自己才能夠執(zhí)行;invoker--表示調(diào)用者可以執(zhí)行
comment 'string':注釋信息
alter procedure pro_book comment '測(cè)試....';
刪除存儲(chǔ)過程或函數(shù):
drop produce pro_book;
總結(jié)
以上是生活随笔為你收集整理的MySQL中引入存储引擎意义是_mysql学习九:存储引擎、存储过程和函数的引入的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓魔方下载教程(安卓魔方下载)
- 下一篇: mysql 数据传输 定时,MySQL数