快捷搜索:  汽车  科技

mysql中存储过程触发器是什么(MySQL触发器)

mysql中存储过程触发器是什么(MySQL触发器)会报如下错误:这个结果,name没有被修改为ttt 这是因为在插入数值的时候,数据已经被插入到数据库里了,这时候是无法通过 set new.name=’ttt’修改name的值的。因为set new.name=’ttt’并不是一个更新的操作。那么如果我将触发器的sql语句“set new.name=’ttt’”改为更新语句,那么能不能实现更新?如下:Person2表的数据如下:当对person表执行插入操作的时候,将插入的name字段改为“ttt”。如下两个操作,触发时间分别是after和before 但是结果是不一样的。触发器创建好之后,我执行如下插入语句insert into person values(10 'ktv8' 'f' 10); name被修改为ttt

1.原文地址

http://www.lgygg.wang/lgyblog/2019/11/13/mySQL触发器存储过程和函数/ 2.触发器

1)触发器概念

监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,例如当对一个表进行操作( insert,delete, update)时就会激活它执行。

2)触发器的使用

语法:

create trigger触发器名字 before|after insert|update|delete on 被创建的表名字 For 触发器的执行间隔 触发器的sql语句

下图是对语法的分析:

mysql中存储过程触发器是什么(MySQL触发器)(1)

注意:
在MySQL中,默认以分号为分隔符,在写存储过程、存储函数、触发器时,编译器会当做SQL语句来进行处理,编译过程会出现错误,所以要事先用”delimiter @”声明@(或者其他,由用户自己定义)为当前的段分隔符,让编译器把两个@之间的内容当做存储过程、存储函数、触发器的代码,在写完整个内容完之后再”delimiter ;”将分隔符还原。
下面通过例子来介绍触发器的使用,这是在MySQL中进行的,现在有两张表person和person2
Person表的数据如下:

mysql中存储过程触发器是什么(MySQL触发器)(2)

Person2表的数据如下:

mysql中存储过程触发器是什么(MySQL触发器)(3)

当对person表执行插入操作的时候,将插入的name字段改为“ttt”。如下两个操作,触发时间分别是after和before 但是结果是不一样的。触发器创建好之后,我执行如下插入语句

insert into person values(10 'ktv8' 'f' 10);

mysql中存储过程触发器是什么(MySQL触发器)(4)


name被修改为ttt

mysql中存储过程触发器是什么(MySQL触发器)(5)

这个结果,name没有被修改为ttt 这是因为在插入数值的时候,数据已经被插入到数据库里了,这时候是无法通过 set new.name=’ttt’修改name的值的。因为set new.name=’ttt’并不是一个更新的操作。
那么如果我将触发器的sql语句“set new.name=’ttt’”改为更新语句,那么能不能实现更新?如下:

mysql中存储过程触发器是什么(MySQL触发器)(6)

会报如下错误:

insert into person values(14 'ktv8' 'f' 10) Error Code: 1442. Can't update table 'person' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 0.031 sec

说明触发器里,触发的sql语句里的操作表不能和触发表一样,否则会报错。
正常的使用情况是,当一张表发生了改变,触发了触发器,修改另一张表,如下操作:

mysql中存储过程触发器是什么(MySQL触发器)(7)

3)触发器其他语句

查看所有的触发器:show triggers; 删除触发器:drop trigger 触发器名字;

4)何时使用触发器

一般情况下,Web应用的瓶颈常在DB上,所以会尽可能的减少DB做的事情,把耗时的服务做成Scale Out,这种情况下,肯定不会使用存储过程;而如果只是一般的应用,DB没有性能上的问题,在适当的场景下,也可以使用存储过程。且如果触发器位于数据库里,不便于调试。
总的来说,触发器我们很少用到,对于Web应用更是很少使用触发器,因为不方便调试,很难定位触发器引起的问题。

3.存储过程

1)什么是存储过程

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

2)存储过程的使用

create procedure 过程名([in|out|inout] 参数名 数据类型 …) 过程体

过程体以begin开头,end结尾。 [in|out|inout] IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量) OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量) INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量) declare 用于声明变量 declare 变量名 类型(长度) default 默认值; Set 用于变量赋值。

下面通过一个例子来介绍存储过程,这个存储过程的功能是计算两个整数相加的结果,如果两个整数都是零,那么就输出存储过程里a b的结果。存储过程如下,这是在MySQL中进行的:

mysql中存储过程触发器是什么(MySQL触发器)(8)

如图,两个输入参数为x和y 输出结果通过result来传达。
在过程体中,通过declare声明了a b和c三个参数,a默认值为5,b默认值为6,c默认值为0,但是通过set c=a b 给c赋值,很明显,c=11。
然后就是判断了,当x和y都小于等于0的时候,将c赋值给result。当x和y都大于零的时候,result=x y。
执行完上面创建存储过程的语句之后,我们就要调用并输出这个存储过程的输出结果。如下:

mysql中存储过程触发器是什么(MySQL触发器)(9)

结果:

mysql中存储过程触发器是什么(MySQL触发器)(10)

下面介绍存储过程的其他操作语句:

列出存储过程的详细列表:show procedure status; 删除:drop procedure 要删除的存储过程的名字; 查看创建存储过程的信息:show create procedure 创建的存储过程名字; 调用存储过程:call 存储过程名

3)何时使用存储过程

触发器和存储过程只有在并发不高的项目,管理系统中使用。如果是面向用户的高并发应用,都不要使用。
触发器和存储过程本身难以开发和维护,不能高效移植。触发器完全可以用事务替代。存储过程可以用后端脚本替代。
复杂的业务逻辑。没办法应用缓存。

4.存储函数

语法:

CREATE FUNCTION 创建的存储函数名字(参数名称 参数类型 ... ...) RETURNS 返回值得类型 函数体;

使用:

调用存储函数:select 函数名字([参数]); //根据定义函数的形参,形参与实参保持一致 查看创建函数信息:show create function 函数名字; 查看所有自定义函数:show function status; 删除存储函数:drop function 函数名字;

下面通过例子来介绍函数,该例子和上面存储过程一样,同样是输出x y的值。代码如下:

mysql中存储过程触发器是什么(MySQL触发器)(11)

调用这个函数,

mysql中存储过程触发器是什么(MySQL触发器)(12)

结果如下:

mysql中存储过程触发器是什么(MySQL触发器)(13)

注意:
不能用于临时表,只能用于永久表。

5.参考文章

触发器:
https://blog.csdn.net/qq_36396104/article/details/80469997
https://blog.csdn.net/zhuoya_/article/details/81320471
存储过程:
https://blog.csdn.net/me_to_007/article/details/90512433#_73
https://www.cnblogs.com/yuanwanli/p/9022617.html

猜您喜欢: