博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL-5.7 创建及查看触发器
阅读量:5111 次
发布时间:2019-06-13

本文共 4040 字,大约阅读时间需要 13 分钟。

触发器的作用是当表上有对应SQL语句发生时,则触发执行。

1.语法

CREATE    [DEFINER = { user | CURRENT_USER }]    TRIGGER trigger_name    trigger_time trigger_event    ON tbl_name FOR EACH ROW    [trigger_order]    trigger_bodytrigger_time: { BEFORE | AFTER }trigger_event: { INSERT | UPDATE | DELETE }trigger_order: { FOLLOWS | PRECEDES } other_trigger_name

说明:

  • trigger_name:触发器的名称,不能与已经存在的触发器重复;
  • trigger_time:{ BEFORE | AFTER },表示在事件之前或之后触发;
  • trigger_event::{ INSERT |UPDATE | DELETE },触发该触发器的具体事件;
  • tbl_name:该触发器作用在tbl_name上;

2.关键说明

  • Definer关键词用来指定trigger的安全环境;
  • trigger_time指定触发器的执行时间,BEFORE和AFTER指定触发器在表中的每行数据修改前或者后执行;
  • trigger_event指定触发该触发器的集体事件:
    INSERT 当新的一行数据插入表中时触发,如执行insert,load data,replace语句插入新数据
    UPDATE 当表的一行数据被修改时触发,如执行update语句时
    DELETE 当表的一行数据被删除时触发,如执行delete,replace语句时
  • 当执行insert into...on duplicate key update语句时,当碰到重复行执行update时,则触发update下的触发器;
  • 从5.7.2版本开始,可以创建具有相同trigger_time和trigger_event的同一个表上的多个触发器,默认情况下,按照创建时间依次执行,通过指定FOLLOWS/PRECEDES改变执行顺序,即FOLLOWS时表示新创建的触发器执行,PRECEDES则表示新触发器先执行;
  • trigger_body 表示触发器触发之后要执行的一个或多个语句,在内部可以引用涉及表的字段,OLD.col_name表示行数据被修改或删除之前的字段数据,NEW.col_name表示数据被插入或修改之后的字段数据;

3.实例

mysql> delimiter //mysql> create trigger simple_trigger    -> after update    -> on students for each row    -> begin    -> insert into students_bak values(old.sid,old.sname,new.sname,old.gender,new.gender,now());    -> end//Query OK, 0 rows affected (0.16 sec)mysql> select * from students;+-----+--------+--------+---------+| sid | sname  | gender | dept_id |+-----+--------+--------+---------+|   1 | Andrew | -1     |       1 ||   2 | Andy   | -1     |       1 ||   3 | Bob    | -1     |       1 ||   4 | Ruth   | -1     |       2 ||   5 | Mike   | -1     |       2 ||   6 | John   | 0      |       3 ||   7 | Cindy  | 1      |       3 ||   8 | Susan  | 1      |       3 |+-----+--------+--------+---------+8 rows in set (0.01 sec)mysql> update students set sname='abc',gender=1 where sid=1;Query OK, 1 row affected (0.03 sec)Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from students;+-----+-------+--------+---------+| sid | sname | gender | dept_id |+-----+-------+--------+---------+|   1 | abc   | 1      |       1 ||   2 | Andy  | -1     |       1 ||   3 | Bob   | -1     |       1 ||   4 | Ruth  | -1     |       2 ||   5 | Mike  | -1     |       2 ||   6 | John  | 0      |       3 ||   7 | Cindy | 1      |       3 ||   8 | Susan | 1      |       3 |+-----+-------+--------+---------+8 rows in set (0.00 sec)mysql> select * from students_bak;+--------+----------+----------+-----------+-----------+---------------------+| oldsid | oldsname | newsname | oldgender | newgender | tstamp              |+--------+----------+----------+-----------+-----------+---------------------+|      1 | Andrew   | abc      |        -1 |         1 | 2017-12-13 11:04:52 |+--------+----------+----------+-----------+-----------+---------------------+1 row in set (0.00 sec)

4.查看触发器(information_schema)

mysql> select TRIGGER_SCHEMA,TRIGGER_NAME,DEFINER,ACTION_STATEMENT from TRIGGERS where TRIGGER_SCHEMA='course';+----------------+----------------+----------------+-----------------------------------------------------------------------------------------------------+| TRIGGER_SCHEMA | TRIGGER_NAME   | DEFINER        | ACTION_STATEMENT                                                                                    |+----------------+----------------+----------------+-----------------------------------------------------------------------------------------------------+| course         | simple_trigger | root@localhost | begininsert into students_bak values(old.sid,old.sname,new.sname,old.gender,new.gender,now());end |+----------------+----------------+----------------+-----------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)

5.删除触发器

DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
  • if exists用来避免删除不存在的触发器时引发的报错
  • 当你执行drop table时,表上的触发器也被drop掉了
mysql> drop trigger simple_trigger;Query OK, 0 rows affected (0.00 sec)

转载于:https://www.cnblogs.com/tongxiaoda/p/8031891.html

你可能感兴趣的文章
设计模式之装饰者模式
查看>>
一道不知道哪里来的容斥题
查看>>
Blender Python UV 学习
查看>>
window添加右键菜单
查看>>
入手腾龙SP AF90mm MACRO
查看>>
Window7上搭建symfony开发环境(PEAR)
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>
第23月第24天 git命令 .git-credentials git rm --cached git stash clear
查看>>
java SE :标准输入/输出
查看>>
一些方便系统诊断的bash函数
查看>>
jquery中ajax返回值无法传递到上层函数
查看>>
css3之transform-origin
查看>>
[转]JavaScript快速检测浏览器对CSS3特性的支持
查看>>
Master选举原理
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
小别离
查看>>
微信小程序-发起 HTTPS 请求
查看>>
WPF动画设置1(转)
查看>>
基于node/mongo的App Docker化测试环境搭建
查看>>
秒杀9种排序算法(JavaScript版)
查看>>