mysql存储过程和触发器的区别


本文摘自PHP中文网,作者(*-*)浩,侵删。

mysql存储过程是在大型数据库系统中, 一组为了完成特定功能的SQL语句集;而触发器是一种特殊类型的存储过程;触发器不同于存储过程,触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。

存储过程: 是在大型数据库系统中, 一组为了完成特定功能的SQL 语句集。触发器:触发器是一种特殊类型的存储过程,它又不同于存储过程,触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。

存储过程:
是在大型数据库系统中,
一组为了完成特定功能的SQL 语句集,
存储在数据库中,经过第一次编译后再次调用不需要再次编译,
用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
存储过程是数据库中的一个重要对象

优点:
1允许模块化程序设计(创建一次多次使用)
2允许更快执行
3减少网络流量
4更好的安全机制

格式:

1

2

3

4

5

6

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.触发器发生错误时,异动的结果会被撤销

格式

1

2

3

4

5

6

7

DELIMITER //

Create trigger --触发器名字 触发时机 触发事件 on 表 for each

row

Begin

--操作的内容

End //

DELIMITER ;

触发对象 :on 表 for each row 触发器绑定实质是表中的所有行,因此当每一行发生改变的时候,就会触发触发器
触发时机:每张表中对应的行都会有不同的状态,当SQL 指令发生的时候,
都会令行中的数据发生改变,每一行总会有两个状态。操作数据之前(before),操作数据(after)之后
触发事件:
Mysql中触发器针对的目标是数据发生改变,对应的操作只有(增,删,改)查询不发生数据的改变,
所以查询没有触发事件
注意事项:
一张表中,每一个触发器时机绑定的触发事件对应的触发器类型只能有一个;
一张表中只能有一个after insert 触发器 因此,一张表中最多的触发器只能有六个

创建存储过程

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

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");

创建触发器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

创建两张表

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存储过程和触发器的区别的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

你知道mysql的limit有性能问题吗

如何写出高性能的sql

mysql免费版好用么

mysql外键约束怎么创建

mysql数据库索引的内容介绍

mysql数据库密码在哪修改

mysql&nbsp;using使用详解

mac如何开启mysql bin-log

如何在linux中重置mysql root密码

都在这儿了!!mysql主从复制的原理和注意事项

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...