我是靠谱客的博主 潇洒鱼,最近开发中收集的这篇文章主要介绍MySQL触发器详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

触发器定义

触发器是用户定义在关系表的一类由事件驱动的特殊过程。一旦定义,触发器将会保存在数据库服务器中,任何用户对表的增、删、改操作均由服务器自动激活相应的触发器。

触发器又叫做:事件-条件-动作规则

    触发器三要素

事件类型:增、删、改; insert、delete、update

触发时间:前后before 和after 

两者的区别:

After:是先完成数据的增删改,在触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作。就比如插入触发器先插入数据,在执行触发语句

Before:先完成触发,再增删改,触发的语句先于监视的增删改,有机会判断,修改即将发生的操作

触发对象:表中的每一条记录(行)

一张表最后有6个触发器

   触发器的格式

create trigger <触发器名>

{before |after } <触发器事件> on <表名>   // 指明触发器激活的事件是在执行之前还是执行之后

referencing NewRow | OldRow as <变量>  //referencing指出引用的变量

for Each {Row | STATEMENT}  

WHEN <触发条件> <触发动作体>

    触发器的作用

触发器类似于约束,但是比约束更加灵活,可以实施更加复杂的检查和操作(强大的数据控制能力)保证数据的完整性,起到约束的作用

创建触发器

在mysql中:没有大括号,没有小括号,不像Java一样代表结束,需要临时修改结束符,再把临时结束符修改回来

Delimiter   :自定义符号,后续代码中只有碰到自定义符号才算结束

Begin  :代表左大括号,开始

End: 代表右大括号,结束

案例1:订单生成一个,商品库就少一个

Delimiter $$
create Trigger after_order After INSERT ON my_order FOR EACH ROW
Begin
    update my_goods set inv = inv -new.g_umber where id = new.g_id
End
$$  -- 代表结束
-- 修正临时结束符
Delimiter ;

触发器记录

触发器记录:不管触发器是否触发,只要当某种操作准备执行,系统就会将当前要操作的记录状态即将执行之后的新状态分别保留下来,提供触发器使用

其中要操作的当前的状态保存到old中,操作之后的可能保存在给new

old代表的是旧记录,new代表的是新记录。

删除的时候没有new的;插入的时候没有old。old和new都是代表记录本身;任何一条记录除了有数据,还有字段名字;使用方式:old.字段名 / new.字段名

注意:MySQL触发器的新增、修改、删除的创建

MySQL触发器和SQL server触发器不同:SQL server 使用inserted、deleted代表被触发的数据

MySQL 使用new代表触发后的新数据行,old代表当前触发器被修改前的数据行。

增删改触发器样例:

INSERT

Delimiter $$
create trigger trigger_name_insert 
After INSERT on test_tb for each row
Begin
    insert into test_tb2(id,name) values(new.id,new.name);
End
$$
Delimiter ;

UPDATE

Delimiter $$
create trigger trigger_name_insert 
After Update on test_tb for each row
Begin
    insert into test_tb2(id,name) values(new.id,new.name);
End
$$
Delimiter ;

Delete

Delimiter $$
create trigger trigger_name_insert 
before delete on test_tb for each row
Begin
    insert into test_tb2(id,name) values(new.id,new.name);
End
$$
Delimiter ;

mysql触发器 验证数据时,不符合不插入例子 

DELIMITER $$
CREATE TRIGGER trigger_name_insert 
BEFORE INSERT ON SC FOR EACH ROW
BEGIN
    SELECT new.grade INTO @a;
    IF new.grade<90 THEN
	signal SQLSTATE 'HY000' SET message_text = '手动抛出异常';
    END IF;
END
$$
DELIMITER ;


DROP TRIGGER trigger_name_insert;
INSERT INTO SC VALUES(1,1,80);

SELECT @s

查看所有触发器

show Trigger

查看触发器创建语句

show create trigger 触发器名
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

删除触发器 

语法:

DROP trigger <触发器名> on <表名>

触发器能做什么

  1. 添加一条数据前,检查数据是否合理,例如检查邮件格式是否正确
  2. 删除数据后,将这条数据进行备份(类似回收站)
  3. 商品卖出,把库存表的数量进行变化
  4. 记录数据库操作日志(操作前后)

最后

以上就是潇洒鱼为你收集整理的MySQL触发器详解的全部内容,希望文章能够帮你解决MySQL触发器详解所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部