1、修改表引擎方法
為灞橋等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及灞橋網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站建設(shè)、網(wǎng)站制作、灞橋網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
alter table table_name engine=innodb;
2、查看系統(tǒng)支持的存儲(chǔ)引擎
show engines;
3、查看表使用的存儲(chǔ)引擎
兩種方法:
a、show table status from db_name where name='table_name';
b、show create table table_name;
如果顯示的格式不好看,可以用\g代替行尾分號(hào)
有人說用第二種方法不準(zhǔn)確
我試了下,關(guān)閉掉原先默認(rèn)的Innodb引擎后根本無法執(zhí)行show create table table_name指令,因?yàn)橹敖ǖ氖荌nnodb表,關(guān)掉后默認(rèn)用MyISAM引擎,導(dǎo)致Innodb表數(shù)據(jù)無法被正確讀取。
4 關(guān)閉Innodb引擎方法
關(guān)閉mysql服務(wù): net stop mysql
找到mysql安裝目錄下的my.ini文件:
找到default-storage-engine=INNODB 改為default-storage-engine=MYISAM
找到#skip-innodb 改為skip-innodb
啟動(dòng)mysql服務(wù):net start mysql
建立存儲(chǔ)過程
Create procedure、Create function
下面是它們的格式:
Create proceduresp_Name ([proc_parameter ])
routine_body
這里的參數(shù)類型可以是 IN OUT INOUTT ,意思和單詞的意思是一樣的,IN 表示是傳進(jìn)來的參數(shù),
OUT 是表示傳出去的參數(shù),INOUT 是表示傳進(jìn)來但最終傳回的參數(shù)。
Create functionsp_Name ([func_parameter ])
Returns type
Routine_body
Returns type 指定了返回的類型,這里給定的類型與返回值的類型要是一樣的,否則會(huì)報(bào)錯(cuò)。
下面給出兩個(gè)簡(jiǎn)單的例子來說明:
1、 顯示 Mysql 當(dāng)前版本
執(zhí)行結(jié)果
mysql use welefen;
Database changed
mysql delimiter // #定義//作為結(jié)束標(biāo)記符號(hào)
mysql create procedure getversion(out param1 varchar(50)) #param1為傳出參數(shù)
- begin
- select version() into param1; #將版本的信息賦值給 param1
- end
- //
Query OK, 0 rows affected (0.00 sec)
mysql call getversion(@a); #調(diào)用getversion()這個(gè)存儲(chǔ)過程
- //
Query OK, 0 rows affected (0.00 sec)
mysql select @a;
- //
+--------------------------+
| @a |
+--------------------------+
| 5.1.14-beta-community-nt |
+--------------------------+
1 row in set (0.00 sec)
2、 顯示”hello world”
執(zhí)行結(jié)果
mysql delimiter //
mysql create function display(w varchar(20)) returns varchar(50)
- begin
- return concat('hello ‘,w);
- end
- //
Query OK, 0 rows affected (0.05 sec)
mysql select display("world");
- //
+------------------+
| display("world") |
+------------------+
| hello world |
+------------------+
1 row in set (0.02 sec)
其他操作存儲(chǔ)過程的語句
前面我們已經(jīng)知道了怎么創(chuàng)建存儲(chǔ)過程,下面看看其他常用的用于操作存儲(chǔ)過程的語句。
Alter {procedure | function} sp_Name []
Alter 語法是用來改變一個(gè)過程或函數(shù)的特征,當(dāng)你想改變存儲(chǔ)過程或者函數(shù)的結(jié)構(gòu)時(shí)可以使
用它。當(dāng)然你也可以先 drop 它再 create。
Drop {procedure | function} [if exists] sp_Name
Drop 語法即用來刪除一個(gè)存儲(chǔ)程序或者函數(shù),當(dāng)你創(chuàng)建的一個(gè)存儲(chǔ)過程或者函數(shù)的名字已經(jīng)存
在時(shí),你想把以前的給覆蓋掉,那么此時(shí)你就可以使用 drop ,然后在創(chuàng)建。
Show create {procedure | function } sp_Name
Show 語法用來顯示創(chuàng)建的存儲(chǔ)過程或者函數(shù)的信息。這里的 show 用法跟數(shù)據(jù)表中的 show 用
法是很相似的。
Show {procedure | function} status [like 'partten']
它返回子程序的特征,如數(shù)據(jù)庫(kù),名字,類型,創(chuàng)建者及創(chuàng)建和修改日期。如果沒有指定樣式,
根據(jù)你使用的語句,所有存儲(chǔ)程序和存儲(chǔ)函數(shù)的信息都被列出。
看了以上的幾個(gè)語法,你是不是感覺跟對(duì)表的操作很相象,那你就想對(duì)了,他們確實(shí)是很相似
的。帶著一份激動(dòng)心情我們繼續(xù)往下看,你會(huì)發(fā)現(xiàn)很簡(jiǎn)單。
Begin ... End 語句
通過 begin end 可以來包含多個(gè)語句,每個(gè)語句以“;”結(jié)尾。
Declare
用Declare 來聲明局部變量
Declarevar_Name type defaulevaule
Delare 條件
Declarecondition_Name CONDITION FOR condition_value
調(diào)用存儲(chǔ)過程
Call
格式:
Callsp_Name [parameter ]
這里的 sp_Name 必須是由 create procedure 創(chuàng)建的名稱。它可以通過聲明的參數(shù)來傳回值,
它也返回受影響的行數(shù),在 MySQL 中可以通過 mysql_affected_rows() 來獲得。
流程控制語句
IF 語句
IFsearch_condition THENstatement_list
[ELSEIFsearch_condition THENstatement_list]
[ELSEstatement_list]
END IF
CASE 語句
CASE case_value
WHEN when_value THENstatement_list
WHEN when_value THENstatement_list]
ELSEstatement_list]
END CASE
LOOP 語句
[begin_label:] LOOP
statement_list
END LOOP [end_label]
LOOP 實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的循環(huán),通過 LEAVE 來退出
LEAVE 語句
LEAVE lable
退出語句,一般可以用在循環(huán)中。
ITERATE 語句
ITERATE lable
ITERATE 一般出現(xiàn)在 LOOP、REPEATE、WHILE 里,意思是再次循環(huán)。
REPEATE 語句
[begin_label:] REPEAT
statement_list
UNTILsearch_condition
END REPEAT [end_label]
REPEAT 語句內(nèi)的語句或語句群被重復(fù),直至 search_condition 為真。
WHILE 語句
[begin_label:] WHILEsearch_condition DO
statement_list
END WHILE [end_label]
WHILE 語句內(nèi)的語句或語句群被重復(fù),直至 search_condition 為真。
運(yùn)用實(shí)例
下面通過幾個(gè)例子來講述他們的應(yīng)用:
對(duì)網(wǎng)站用戶的操作
為了簡(jiǎn)單,用戶表只有用戶名和密碼的信息.在服務(wù)端,我們建立如下的表:
代碼片段
Drop table if exists user;
Create table user(
Id int unsigned not null auto_increment,
Name varchar(20) not null,
Pwd char(32) not null,
Primary key(Id)
);
添加用戶的存儲(chǔ)過程:
代碼片段
Delimiter //
Create procedure insertuser(in username varchar(20),in userpwd varchar(32))
Begin
Insert into welefen.user(Name,Pwd) values (username,md5(userpwd));
End
//
驗(yàn)證用戶的存儲(chǔ)過程:
代碼片段
Delimiter //
Create procedure validateuser(in username varchar(20),out param1)
Begin
Select Pwd into param1 from welefen.user where Name=username;
End
//
修改密碼的存儲(chǔ)過程:
代碼片段
Delimiter //
Create procedure modifyPwd(in username varchar(20),in userpwd varchar(32))
Begin
Update welefen.user set Pwd=md5(userpwd) where Name=username;
End
//
刪除用戶的存儲(chǔ)過程:
代碼片段
Delimiter //
Create procedure deleteuser(in username varchar(20))
Begin
delete from welefen.user where Name=username;
End
//
在客戶端,我們給出如下的程序:
代碼片段
文件名:ProcedureUser.php
?php
if (!mysql_connect("localhost","root","welefen")){
echo "連接數(shù)據(jù)庫(kù)失敗";
}
if (!mysql_select_db("welefen")){
echo "選擇數(shù)據(jù)庫(kù)表失敗br";
}
$insert_user=array("welefen","welefen");//這里的welefen分別為用戶名、密碼
if (mysql_query("call insertuser('$insert_user[0]','$insert_user[1]')")){
echo "添加用戶$insert_user[0]成功br";
}else {
echo "添加用戶$insert_user[0]失敗br";
}
$validate_user=array("welefen","welefen");//這里的welefen分別為用戶名、密碼
mysql_query("call validateuser('$validate_user[0]',@a)");
$Pwd=mysql_query("select @a");
$result=mysql_fetch_array($Pwd);
if ($result[0]==md5($validate_user[1])){
echo "用戶$validate_user[0]驗(yàn)證正確br";
}else {
echo "用戶$validate_user[0]驗(yàn)證錯(cuò)誤br";
}
$modify_Pwd=array("welefen","weilefeng"); //welefen為用戶名weilefeng為新密碼
if (mysql_query("call modifyPwd('$modify_Pwd[0]','$modify_Pwd[1]')")){
echo "用戶$modigy_Pwd[0]的密碼修改成功br";
}else {
echo "用戶$modigy_Pwd[0]的密碼修改失敗br";
}
$delete_user=array("welefen"); //welefen為用戶名
if (mysql_query("call deleteuser('$delete_user[0]')")){
echo "用戶$delete_user[0]刪除成功br";
}else {
echo "用戶$delete_user[0]刪除失敗br";
}
?
程序運(yùn)行的結(jié)果:
執(zhí)行結(jié)果
添加用戶welefen 成功
用戶welefen 驗(yàn)證正確
用戶welefen 的密碼修改成功
用戶welefen 刪除成功
以上的這個(gè)程序簡(jiǎn)單的說明了Mysql 中的存儲(chǔ)過程結(jié)合PHP 的應(yīng)用,當(dāng)然在實(shí)際應(yīng)用要比這個(gè)
復(fù)雜的多。
驗(yàn)證角谷猜想
角谷猜想:給定一個(gè)整數(shù)x,若x%2=1,則x=3*x+1,否則x=x/2,如此循環(huán)下去,經(jīng)過有限步驟必
能得到1。
例 如 : 初 始 整 數(shù) 為 9 , 則
9-28-14-7-22-11-34-17-52-26-13-40-20-10-5-16-8-4-2-1
為了說明存儲(chǔ)過程中一些語法的應(yīng)用,我們通過存儲(chǔ)過程來實(shí)現(xiàn)它:
執(zhí)行結(jié)果
mysql delimiter //
mysql create procedure jgguess(in number int)
- begin
- declare param1 int default 1;
- set @a=concat(number);
- jiaogu:loop #循環(huán)開始
- set param1=number%2;
- if param1=1 then set number=number*3+1; #number 為奇數(shù),將它乘3加 1
- else set number=number/2;
- end if;
- set @a=concat(@a,'-',number);
- if number1 then iterate jiaogu; #number 不為 1,繼續(xù)循環(huán)
- end if;
- leave jiaogu; #退出循環(huán)
- end loop jiaogu;
- end
- //
Query OK, 0 rows affected (0.00 sec)
mysql call jgguess(11);
- //
Query OK, 0 rows affected (0.00 sec)
mysql select @a//
+-------------------------------------------------------+
| @a |
+-------------------------------------------------------+
| 11-34-17-52-26-13-40-20-10-5-16-8-4-2-1 |
+-------------------------------------------------------+
1 row in set (0.02 sec)
在這個(gè)存儲(chǔ)過程中,你傳入的參數(shù)不能超過int 型數(shù)據(jù)的范圍,否則就會(huì)報(bào)錯(cuò)。
觸發(fā)器
觸發(fā)器是與表有關(guān)的命名數(shù)據(jù)庫(kù)對(duì)象,當(dāng)表上出現(xiàn)特定事件時(shí),將激活該對(duì)象。例如當(dāng)我們向
某個(gè)表插入一行數(shù)據(jù)時(shí)發(fā)生一個(gè)事件或者刪除某個(gè)記錄時(shí)觸發(fā)某個(gè)事件。
語法:
CREATE TRIGGER trigger_Name trigger_time trigger_event
ON tbl_Name FOR EACHROW trigger_stmt
trigger_time 是觸發(fā)器的動(dòng)作時(shí)間。它可以是 BEFORE 或 AFTER ,以指明觸發(fā)器是在激活它的
語句之前或之后觸發(fā)。
trigger_event 指明了激活觸發(fā)器的語句的類型。trigger_event 可以是下述值之一:
INSERT:將新行插入表時(shí)激活觸發(fā)器,例如,通過 INSERT、LOADDATA 和 REPLACE 語句;
UPDATE:更改某一行時(shí)激活觸發(fā)器,例如,通過UPDATE語句;
DELETE:從表中刪除某一行時(shí)激活觸發(fā)器,例如,通過 DELETE 和 REPLACE 語句。
例如當(dāng)我們向上面的user 表中增加一個(gè)用戶名為“welefen ”時(shí),我們把記錄用戶數(shù)的表的值增
加 1;
代碼片段
Create table numuser(
Num int not null default 0
);
Delimiter //
Create trigger testnum after insert on welefen.user for each row
Begin
Update welefen.numuser set Num=Num+1;
End
//
視圖
當(dāng)我們想得到數(shù)據(jù)表中某些字段的信息,并想把他們保存時(shí)我們就可以用視圖。
語法:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_Name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
例如我們想對(duì)上面的用戶表使用視圖,可以這樣:
Create viewwelefen.userview as select * fromwelefen.user;
查看視圖的信息可以使用:
Select * fromwelfen.userview;
php調(diào)用mysql存儲(chǔ)過程和函數(shù)的方法
存儲(chǔ)過程和函數(shù)是MySql5.0剛剛引入的。關(guān)于這方面的操作在PHP里面沒有直接的支持。但是由于Mysql PHP API的設(shè)計(jì),使得我們可以在以前的PHP版本中的mysql php api中支持存儲(chǔ)過程和函數(shù)的調(diào)用。
在php中調(diào)用存儲(chǔ)過程和函數(shù)。
1。調(diào)用存儲(chǔ)過程的方法。
a。如果存儲(chǔ)過程有 IN/INOUT參數(shù),聲明一個(gè)變量,輸入?yún)?shù)給存儲(chǔ)過程,該變量是一對(duì),
一個(gè)php變量(也可以不必,只是沒有php變量時(shí),沒有辦法進(jìn)行動(dòng)態(tài)輸入),一個(gè)Mysql
變量。