MySQL中引入存储引擎意义是_mysql学习九:存储引擎、存储过程和函数的引入
存儲引擎:
存儲引擎是mysql特有的,共有7種,常用的有myisam、memory、innodb
查看表的存儲引擎:
show create table 表名;
修改表的存儲引擎:
alter table 表名 engine=存儲引擎名稱;
1.myisam存儲引擎:可轉換為壓縮只讀表來節省空間
使用三個文件表示每個表:
格式文件--存儲表的結構? 表名.frm
數據文件---存儲表的數據? 表名.MYD
索引文件--存儲表的索引 表名.MYI
2.innodb存儲引擎的特征:
每個innodb表,在數據庫目錄中以.frm格式文件表示
innodb表空間tablespace被用于存儲表的內容
提供一組用來記錄事務性活動的日志文件
用commit提交、savepoint 及rollback(回滾)支持事務處理
提供全部acid兼容
在mysql服務器崩潰后,提供自動恢復
多版本mvcc和行級鎖
支持外鍵,及引用的完整性,包括級聯更新和刪除
3.memory存儲引擎,以前被稱為headp引擎
使用memory存儲引擎的表,因為數據存儲在內存中,且行的長度固定,所以使得memory存儲引擎非常快
memory存儲引擎管理的表具有下列特征
在數據庫目錄內,每個表均以.frm格式文件表示
表數據及索引被存儲在內存中
表級鎖機制
字段屬性不能包含text或blob字段
選擇合適的存儲引擎:
myisam表最適合于大量的數據讀而少量數據更新的混合操作。myisam表的另一種適用情形是使用壓縮的只讀表。
如果查詢中包含較的數據更新操作,應使用innodb。其行級鎖機制和多版本的支持為數據讀取和更新的混合提供了良好的并發機制。
使用memory存儲引擎存儲非永久需要的數據,或者是能夠從基于磁盤的表中重新生成的數據。
存儲過程和函數,是在數據庫中定義一些SQL語句的集合,然后直接調用這些存儲過程和函數來執行已經定義好的sql語句。
存儲過程和函數,可以避免開發人員重復的編寫相同的sql語句;而且,存儲過程和函數是在mysql服務器中存儲和執行的,可以減少客戶端和服務端的數據傳輸;
一、創建存儲過程和存儲函數
1.創建存儲過程
create procedure 存儲過程的名稱 ([proc_parameter[,......]]) [characteristic......] routine_body
proc_parameter:表示存儲過程的參數列表;由3分部分組成,輸入輸出類型、參數名和參數類型---[in | out | inout] param_name type
其中,in表示輸入參數;out表示輸出參數;inout表示既可以是輸入,也可以是輸出
param_name,是存儲過程的參數的名稱
type:指定存儲過程的參數類型,該類型可以是mysql數據庫的任意數據類型
characteristic:指定存儲過程的特性、配置;有多個可取值
language sql:說明 routine_body部分是由sql語言的語句組成,這也是數據庫系統默認的語言
[not] deterministic:指明存儲過程的執行結果是否是確定的。deterministic表明每次執行存儲過程時,相同的輸入會得到相同的輸出。not deterministic表示結果是非確定的,相同的輸入可能得到不同的輸出。默認情況下,結果是非確定的。
{contains sql | no sql | reads sql data | modifies sql data }:指明子程序使用sql語句的限制
contains sql表示子程序包含sql語句;
no sql表示子程序中不包含sql語句
reads sql data表示子程序中包含讀數據的語句
modifies sql data表示子程序中包含寫數據的語句
默認情況下,系統會指定為contains sql
sql security {definer |invoker}:指明誰有權限來執行。definer表示只有定義者自己才能夠執行;invoker表示調用者可以執行。默認情況下,系統指定的權限是definer。
comment "string":注釋信息
routine_boy:是sql代碼的內容,可以用begin......end來標志sql代碼的開始和結束。如果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;
調用存儲過程:1,是輸入的參數;@total是輸出的參數;@表示定義的是全局參數
call pro_book(1, @total);
2.創建存儲函數
create function 存儲函數的名稱 ([func_parameter[,......]])
returns type [characteristic....] routine_body;
func_parameter:存儲函數的參數列表。可以由多個參數組成,每個參數由參數名稱和參數類型組成,形式如下:
param_name type:其中,param_name參數是存儲函數的參數名稱;type參數是指定存儲函數的參數類型,該類型可以是mysql數據庫的任意數據類型
returns type:指定返回值的類型
characteristic:指定存儲過程的特性,該參數的取值與存儲過程中的聚會是一樣的
routine_body:是sql的代碼內容,可以用begin....end來標志sql代碼的開始和結束
delimiter &&
CREATE FUNCTION func_book ( bookId INT ) RETURNS VARCHAR ( 20)BEGIN
RETURN ( SELECT bookName FROM book WHERE id =bookId );END &&delimiter;
調用存儲函數:
select func_book(1);select func_book(2);
3.變量的使用
1.)定義變量
declare 變量名稱[,...] type [default value]
創建示例表:
create table test_user(id int not null auto_increment primary key,
userNamevarchar(20),
passwordvarchar(64)
)
創建存儲過程,定義變量:
delimiter &&
CREATE PROCEDURE pro_user ( ) BEGIN
DECLARE a,b VARCHAR ( 20);INSERT INTO test_user values(null, a, b );END &&delimiter;
調用存儲過程:
call pro_user();
調用存儲過程的結果:
2).為變量賦值
set 變量名=expr[, 變量名=expr].........
創建存儲過程,定義變量,給變量賦值:
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;
調用存儲過程:
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.游標的使用
查詢語句可能查詢出多條記錄,在存儲過程和存儲函數中使用游標來逐條讀取查詢結果集中的記錄。
游標的使用,包括聲明游標、打開游標、使用游標和關閉游標。
游標必須聲明在處理程序之前,并且聲明在變量和條件之后。
1).聲明游標:
declare 游標名稱 cursor for select查詢語句;
2).打開游標
open 游標名稱;
3).使用游標
fetch 游標名稱 into 變量名稱[,變量名稱......]
創建存儲過程,定義變量,定義打開使用關閉游標:使用游標查詢的結果,賦值給變量
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;
調用存儲過程:
call pro_user4;
5.流程的控制
存儲過程和存儲函數中,可以使用流程控制來控制語句的執行。
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語句可以使某些特定的語句重復執行,實現一個簡單的循環。
但是LOOP語句本身沒有停止循環的語句,必須遇到LEAVE語句等,才會停止。
[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語句:也是用來跳出循環。但是,ITERATE語句是跳出本次循環,然后直接進入下一次循環。相當于,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語句:是有條件控制的循環語句。當滿足特定條件時,就會跳出循環語句。
[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);
二、調用存儲過程和函數
1.調用存儲過程
call 存儲過程的名稱([parameter[,........]);
2.調用存儲函數
call 存儲函數的名稱([parameter[,........]);
三、查看存儲過程和函數
1 show status:查看存儲過程和函數的狀態
show {procedure|function} status [like 'pattern'];
2.show create:查看存儲過程的函數的定義
show create {procedure|function} 存儲函數的名稱;
3.從information_schema.Routins表中,查看存儲過程和函數的信息
四、修改存儲過程和函數
alter {procedure|function} 名稱 [characteristic.......]
characteristic:
contains sql | no sql | reads sql data | modifies sql data
| sql security {definer | invoker}
|comment 'string'
contains sql:表示子程序包含sql讀或寫語句,默認值
no sql:表示子程序中不包含sql語句
reads sql data:表示子程序中包含讀數據的語句
modifies sql data:表示子特別子程序中包含寫數據的語句
sql security {definer | invoker}:指明誰有權限執行
definer---表示只有定義者自己才能夠執行;invoker--表示調用者可以執行
comment 'string':注釋信息
alter procedure pro_book comment '測試....';
刪除存儲過程或函數:
drop produce pro_book;
總結
以上是生活随笔為你收集整理的MySQL中引入存储引擎意义是_mysql学习九:存储引擎、存储过程和函数的引入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓魔方下载教程(安卓魔方下载)
- 下一篇: 安卓连点器手机版(安卓连点器)