旗下导航:搜·么
当前位置:网站首页 > MySQL教程 > 正文

mysql存储历程和触发器的区分【MySQL教程】,mysql

作者:搜教程发布时间:2019-12-01分类:MySQL教程浏览:61评论:0


导读:存储历程:是在大型数据库系统中,一组为了完成特定功用的SQL语句集。触发器:触发器是一种特别范例的存储历程,它又差别于存储历程,触发器主假如经由过程事宜举行触发而被实行的,而...
存储历程: 是在大型数据库系统中, 一组为了完成特定功用的SQL 语句集。触发器:触发器是一种特别范例的存储历程,它又差别于存储历程,触发器主假如经由过程事宜举行触发而被实行的,而存储历程能够经由过程存储历程名字而被直接挪用。

存储历程:
是在大型数据库系统中,
一组为了完成特定功用的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存储历程和触发器的区分的细致内容,更多请关注ki4网别的相干文章!

标签:mysql


欢迎 发表评论: