本文主要給大家簡單講講mysql存儲過程和觸發器有啥具體區別,相關專業術語大家可以上網查查或者找一些相關書籍補充一下,這里就不涉獵了,我們就直奔主題吧,希望mysql存儲過程和觸發器有啥具體區別這篇文章可以給大家帶來一些實際幫助。
存儲過程:
是在大型數據庫系統中,
一組為了完成特定功能的SQL 語句集,
存儲在數據庫中,經過第一次編譯后再次調用不需要再次編譯,
用戶通過指定存儲過程的名字并給出參數(如果該存儲過程帶有參數)來執行它。
存儲過程是數據庫中的一個重要對象
優點:
1允許模塊化程序設計(創建一次多次使用)
2允許更快執行
3減少網絡流量
4更好的安全機制
格式:
DELIMITER // CREATE PROCEDURE 儲存名([ IN ,OUT ,INOUT ]?參數名?數據類形...) BEGIN SQL語句 END // DELIMITER ;
調用過程:
用call 過程名( )
查看所有的存儲過程show procedure status;
查看創建的存儲過程show create procedure 過程名;
刪除過程 drop procedure 過程名
In 表示參數從外部傳入到里面使用(過程內部使用)
Out 表示參數從過程里邊把數據保存到變量中,交給外部使用,所有傳入的必須是變量 如果說傳入的out變量本身在外部有數據,那么在進入過程之后,第一件事就是被清空,設為null
Inout 數據可以從外部傳入到過程內部使用,同時內部操作之后,又會將數據返回給外部
觸發器:
觸發器是一種特殊類型的存儲過程,它又不同于存儲過程,
觸發器主要是通過事件進行觸發而被執行的,而存儲過程可以通過存儲過程名字而被直接調用。
作用:
1.可在寫入數據表前,強制檢驗或轉換數據
2.觸發器發生錯誤時,異動的結果會被撤銷
格式
DELIMITER // Create trigger --觸發器名字 觸發時機 觸發事件 on 表 for each row Begin --操作的內容 End // DELIMITER ;
觸發對象 :on 表 for each row 觸發器綁定實質是表中的所有行,因此當每一行發生改變的時候,就會觸發觸發器
觸發時機:每張表中對應的行都會有不同的狀態,當SQL 指令發生的時候,
都會令行中的數據發生改變,每一行總會有兩個狀態。操作數據之前(before),操作數據(after)之后
觸發事件:
Mysql中觸發器針對的目標是數據發生改變,對應的操作只有(增,刪,改)查詢不發生數據的改變,
所以查詢沒有觸發事件
注意事項:
一張表中,每一個觸發器時機綁定的觸發事件對應的觸發器類型只能有一個;
一張表中只能有一個after insert 觸發器 因此,一張表中最多的觸發器只能有六個
創建存儲過程
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 // 查看存儲過程 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; // 受影響的行數 try { sqlSession = MyBatisUtil.createSqlSession(); row = sqlSession.getMapper(UserMapper.class).saveUser(userCode, userName, userRole, gender, phone); // 提交事務 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");
創建觸發器
創建兩張表 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,'手機',1000),(null,'電腦',500),(null,'游戲機',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 // 測試 insert into my_orders values(null,3,5);
mysql存儲過程和觸發器有啥具體區別就先給大家講到這里,對于其它相關問題大家想要了解的可以持續關注我們的行業資訊。我們的板塊內容每天都會捕捉一些行業新聞及專業知識分享給大家的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。