我是靠谱客的博主 光亮板凳,最近开发中收集的这篇文章主要介绍mysql定义一个触发器分数增加10%_关系型数据库学习——Mysql触发器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

触发器是用户定义在关系表由事件驱动的特殊过程,一旦定义,书法器将被保存在数据库服务器中。触发器类似于约束,但是比约束更加灵活

1.触发器定义

由于不同的数据库对触发器的语法各有不同,本文针对mysql数据库

create trigger

on tablename

for each row

begin

触发条件

end;

2.BEGIN … END 详解

在MySQL中,BEGIN … END 语句的语法为:

BEGIN

[statement_list]

END

其中,statement_list 代表一个或多个语句的列表,列表内的每条语句都必须用分号(;)来结尾。

而在MySQL中,分号是语句结束的标识符,遇到分号表示该段语句已经结束,MySQL可以开始执行了。因此,解释器遇到 statement_list 中的分号后就开始执行,然后会报出错误,因为没有找到和 BEGIN 匹配的 END。这时就会用到 DELIMITER 命令(DELIMITER 是定界符,分隔符的意思),它是一条命令,不需要语句结束标识,语法为:

DELIMITER new_delemiter

new_delemiter 可以设为1个或多个长度的符号,默认的是分号(;),我们可以把它修改为其他符号,如管道符:

DELIMITER |

在这之后的语句,以分号结束,解释器不会有什么反应,只有遇到了管道符,才认为是语句结束。注意,使用完之后,我们还应该记得把它给修改回来。

例1.当对表SC的grade进行修改时,如果分数增加了10%,则将此次操作记录到另一个表SC_t(sno,cno,oldgrade,newgrade)中,oldgrade修改前的分数,newgrade修改后的分数。

delimiter |

create trigger sc_t

after UPDATE on sc

for each row

begin

if (old.grade*1.1=new.grade)

then

insert into sc_u(sno,cno,oldgrade,newgrade)

values(old.sno,old.cno,old.grade,new.grade);

end if;

end

|

3.NEW 与 OLD 详解

上述示例中使用了NEW关键字,和 MS SQL Server 中的 INSERTED 和 DELETED 类似,MySQL 中定义了 NEW 和 OLD,用来表示

触发器的所在表中,触发了触发器的那一行数据。

具体地:

在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;

在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;

在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;

使用方法: NEW.columnName (columnName 为相应数据表某一列名)

另外,OLD 是只读的,而 NEW 则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用(如每插入一个学生前,都在其学号前加“2013”)。

4.删除触发器

drop trigger on;

注: 尽量少使用触发器,不建议使用。

假设触发器触发每次执行1s,insert table 500条数据,那么就需要触发500次触发器,光是触发器执行的时间就花费了500s,而insert 500条数据一共是1s,那么这个insert的效率就非常低了。因此我们特别需要注意的一点是触发器的begin end;之间的语句的执行效率一定要高,资源消耗要小。

触发器尽量少的使用,因为不管如何,它还是很消耗资源,如果使用的话要谨慎的使用,确定它是非常高效的:触发器是针对每一行的;对增删改非常频繁的表上切记不要使用触发器,因为它会非常消耗资源。

最后

以上就是光亮板凳为你收集整理的mysql定义一个触发器分数增加10%_关系型数据库学习——Mysql触发器的全部内容,希望文章能够帮你解决mysql定义一个触发器分数增加10%_关系型数据库学习——Mysql触发器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部