溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mysql存儲(chǔ)過程和觸發(fā)器有啥具體區(qū)別

發(fā)布時(shí)間:2020-06-04 10:37:53 來源:PHP中文網(wǎng) 閱讀:309 作者:三月 欄目:MySQL數(shù)據(jù)庫(kù)

本文主要給大家簡(jiǎn)單講講mysql存儲(chǔ)過程和觸發(fā)器有啥具體區(qū)別,相關(guān)專業(yè)術(shù)語大家可以上網(wǎng)查查或者找一些相關(guān)書籍補(bǔ)充一下,這里就不涉獵了,我們就直奔主題吧,希望mysql存儲(chǔ)過程和觸發(fā)器有啥具體區(qū)別這篇文章可以給大家?guī)硪恍?shí)際幫助。                                                             

mysql存儲(chǔ)過程和觸發(fā)器有啥具體區(qū)別

存儲(chǔ)過程:
是在大型數(shù)據(jù)庫(kù)系統(tǒng)中,
一組為了完成特定功能的SQL 語句集,
存儲(chǔ)在數(shù)據(jù)庫(kù)中,經(jīng)過第一次編譯后再次調(diào)用不需要再次編譯,
用戶通過指定存儲(chǔ)過程的名字并給出參數(shù)(如果該存儲(chǔ)過程帶有參數(shù))來執(zhí)行它。
存儲(chǔ)過程是數(shù)據(jù)庫(kù)中的一個(gè)重要對(duì)象

優(yōu)點(diǎn):
1允許模塊化程序設(shè)計(jì)(創(chuàng)建一次多次使用)
2允許更快執(zhí)行
3減少網(wǎng)絡(luò)流量
4更好的安全機(jī)制

格式:

DELIMITER // 
CREATE PROCEDURE 儲(chǔ)存名([ IN ,OUT ,INOUT ]?參數(shù)名?數(shù)據(jù)類形...) 
BEGIN 
SQL語句 
END // 
DELIMITER ;

調(diào)用過程:

用call 過程名( )

查看所有的存儲(chǔ)過程show procedure status;
查看創(chuàng)建的存儲(chǔ)過程show create procedure 過程名;
刪除過程 drop procedure 過程名

In 表示參數(shù)從外部傳入到里面使用(過程內(nèi)部使用)
Out 表示參數(shù)從過程里邊把數(shù)據(jù)保存到變量中,交給外部使用,所有傳入的必須是變量 如果說傳入的out變量本身在外部有數(shù)據(jù),那么在進(jìn)入過程之后,第一件事就是被清空,設(shè)為null
Inout 數(shù)據(jù)可以從外部傳入到過程內(nèi)部使用,同時(shí)內(nèi)部操作之后,又會(huì)將數(shù)據(jù)返回給外部

觸發(fā)器:

觸發(fā)器是一種特殊類型的存儲(chǔ)過程,它又不同于存儲(chǔ)過程,
觸發(fā)器主要是通過事件進(jìn)行觸發(fā)而被執(zhí)行的,而存儲(chǔ)過程可以通過存儲(chǔ)過程名字而被直接調(diào)用。

作用:
1.可在寫入數(shù)據(jù)表前,強(qiáng)制檢驗(yàn)或轉(zhuǎn)換數(shù)據(jù)
2.觸發(fā)器發(fā)生錯(cuò)誤時(shí),異動(dòng)的結(jié)果會(huì)被撤銷

格式

DELIMITER //
Create trigger --觸發(fā)器名字 觸發(fā)時(shí)機(jī) 觸發(fā)事件 on 表 for each 
row 
Begin 
--操作的內(nèi)容 
End // 
DELIMITER ;

觸發(fā)對(duì)象 :on 表 for each row 觸發(fā)器綁定實(shí)質(zhì)是表中的所有行,因此當(dāng)每一行發(fā)生改變的時(shí)候,就會(huì)觸發(fā)觸發(fā)器
觸發(fā)時(shí)機(jī):每張表中對(duì)應(yīng)的行都會(huì)有不同的狀態(tài),當(dāng)SQL 指令發(fā)生的時(shí)候,
都會(huì)令行中的數(shù)據(jù)發(fā)生改變,每一行總會(huì)有兩個(gè)狀態(tài)。操作數(shù)據(jù)之前(before),操作數(shù)據(jù)(after)之后
觸發(fā)事件:
Mysql中觸發(fā)器針對(duì)的目標(biāo)是數(shù)據(jù)發(fā)生改變,對(duì)應(yīng)的操作只有(增,刪,改)查詢不發(fā)生數(shù)據(jù)的改變,
所以查詢沒有觸發(fā)事件
注意事項(xiàng):
一張表中,每一個(gè)觸發(fā)器時(shí)機(jī)綁定的觸發(fā)事件對(duì)應(yīng)的觸發(fā)器類型只能有一個(gè);
一張表中只能有一個(gè)after insert 觸發(fā)器 因此,一張表中最多的觸發(fā)器只能有六個(gè)

創(chuàng)建存儲(chǔ)過程

DELIMITER //
CREATE PROCEDURE addUser
(IN uCode VARCHAR(50),IN uName VARCHAR(20),IN uRole INT,IN sex INT,IN tel VARCHAR(30))
BEGIN
INSERT INTO smbms_user (userCode,userName,userRole,gender,phone)
VALUES(uCode,uName,uRole,sex,tel);
END//
DELIMITER //
查看存儲(chǔ)過程 show procedure status;
<insert id="saveUser">
CALL addUser(#{userCode},#{userName},#{userRole},#{gender},#{phone})
</insert>
public int saveUser(
@Param("userCode") String userCode,
@Param("userName") String userName,
@Param("userRole") Integer userRole,
@Param("gender") Integer gender,
@Param("phone") String phone);
public List<User> findUserListPage(String queryUserName, 
Integer queryUserRole, 
Integer currentPageNo, Integer pageSzie);

public boolean saveUser(String userCode, String userName, Integer userRole,
Integer gender, String phone) {
SqlSession sqlSession = null;
int row = 0; // 受影響的行數(shù)
try {
sqlSession = MyBatisUtil.createSqlSession();
row = sqlSession.getMapper(UserMapper.class).saveUser(userCode, userName, userRole, gender, phone);
// 提交事務(wù)
sqlSession.commit();
} catch (Exception e) {
if (sqlSession != null) {
sqlSession.rollback();
}
row = 0;
e.printStackTrace();
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
if (row > 0) {
return true;
}
return false;
}

userService.saveUser("zhangcuishan", "亞索", 1, 2, "15645678941");

創(chuàng)建觸發(fā)器

創(chuàng)建兩張表
create table my_goods(
id int primary key auto_increment,
name varchar(20) not null,
inv int
)
create table my_orders(
id int primary key auto_increment,
goods_id int not null,
goods_num int not null)

insert into my_goods values(null,'手機(jī)',1000),(null,'電腦',500),(null,'游戲機(jī)',100);

DELIMITER //
CREATE TRIGGER a_i_o_t AFTER INSERT ON my_orders FOR EACH ROW
BEGIN
UPDATE my_goods SET inv =inv -new.goods_num WHERE id=new.goods_id;
END
//
DELIMITER ;

DELIMITER //
CREATE TRIGGER b_i_o_t BEFORE INSERT ON my_orders FOR EACH ROW 
BEGIN 
SELECT inv FROM my_goods WHERE id=new.goods_id INTO @inv;
IF @inv <new.goods_num THEN 
INSERT INTO xxx VALUES('xx');
END IF;
END 
//
DELIMITER //
 

測(cè)試 insert into my_orders values(null,3,5);

mysql存儲(chǔ)過程和觸發(fā)器有啥具體區(qū)別就先給大家講到這里,對(duì)于其它相關(guān)問題大家想要了解的可以持續(xù)關(guān)注我們的行業(yè)資訊。我們的板塊內(nèi)容每天都會(huì)捕捉一些行業(yè)新聞及專業(yè)知識(shí)分享給大家的。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI