今天又学习了一下mysql触发器的相关知识,对此做了一些笔记和总结。

定义及作用

触发器是一个被指定关联到一个表的数据对象,触发器不需要调用,当对一个表的特别事件出现时,它就会被激活。触发器的代码也是由声明式和过程式SQL语句组成,因此用在存储过程中的语句也可以用在触发器的定义中。

触发器的作用如下:

  • 触发器与表的关系密切,用于保护表中的数据。
  • 利用触发器可以方便的实现数据库中数据的完整性。

创建触发器

创建触发器使用CREATE TRIGGER语句,若要查看数据库中的触发器,可以使用SHOW TRIGGERS命令。

创建触发器的语法格式如下:

CREATE TRIGGER trigger_name  trigger_time trigger_event  ON tb1_name FOR EACH ROW trigger_stmt

说明:

  • trigger_name:触发器的名称,触发器在当前的数据库中必须具有唯一的名称,如果要在某个特定的数据库中创建,名称前面要加上数据库的名称。

  • trigger_time:触发器触发的时刻,有两个选项:AFTER和BEFORE,以代表触发器是在激活它的语句之前或之后触发。如果想要在激活触发器的语句执行之后执行几个或更多的改变,通常使用AFTER选项;如果想要验证新数据是否满足使用的限制,则使用BEFORE选项。

  • trigger_event:触发事件,指明了激活触发程序的语句类型。触发事件可以是以下情况:

    INSERT:将新行插入表时激活触发器。例如,通过INSERT,LOAD DATA和REPLACE语句。

    UPDATE:更改某行数据时激活触发器。例如,通过UPDATE语句。

    DALETE:从表中删除一行时激活触发器。例如。通过DELETE和REPLACE语句。

  • tb1_name:与触发器相关的表名,在该表上发生触发事件时才会激活触发器。同一个表中不能拥有两个具有相同触发时刻和事件的触发器。

  • FOR EACH ROW:这个声明用来指定,对于受触发事件影响的每一行都要激活触发器的动作。

  • trigger_stmt:触发器动作,包含触发器激活时将要执行的语句。如果要执行多个语句,可以使用BEGIN...END复合语句结构。这样,就能使用存储过程允许的相同语句。

  • 一张表中最多可以创建6个触发器,时间(BEFORE,AFTER)对类型(INSERT、UPDATE、DELETE)。

注意:触发器不能返回任何的结果到客户端,为了阻止从触发器返回结果,还要在触发器定义中包含SELECT语句。同样,也不能调用将数据返回客户端的存储过程。

例子:在user表中新增一条数据时,同时在与之关联的另外一张表中插入一条数据。

delimiter $$
create trigger useupdate after insert on user for each row
begin
insert into questionnaire values(1,'1','1',1);
end $$
delimiter ; insert into user values (19,'aa','bb','cc','dd','ff');

结果如图:



删除触发器

语法格式:

DROP TRIGGER [schema_name]trigger_name

说明:

  • trigger_name:指要删除的触发器名称。
  • schema_name为所在数据库的名称,如果是当前数据库,可以省略。

例子:

drop trigger useupdate;

修改触发器

不能直接修改触发器,要先删除后新增。

触发器记录

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

  • old代表旧记录,new 代表新记录;
  • 删除之后没有new的,插入的时候没有old。
  • old和new 代表记录本身。
  • 对于INSERT语句,只有NEW 是合法的;对于DELETE语句,只有old才合法;而UPDATE语句可以与NEW和OLD同时使用。

使用方式:

old.字段名/new.字段名。

例子:删除一个用户时,同时删除与用户关联的另外一张表中的信息。由于删除用户时,用户的id可以已经删除了,所以使用old。

delimiter $$
create trigger userdelete after delete on user for each row
begin
delete from questionnaire where id = old.id;
end $$
delimiter ; delete from user where id = '19';

我只添加了一条数据用于演示,所以执行完后,数据是空的。

总结

其实,触发器很好理解,就是在一个动作发生时,又有另一个动作在发生,只是时机有所不同。

MySql学习笔记——触发器的更多相关文章

  1. MySQL学习笔记一

    MySQL 学习笔记 一 一.数据库简单介绍 1. 按照数据库的发展时间顺序,主要出现了以下类型数据库系统: Ø 网状型数据库 Ø 层次型数据库 Ø 关系型数据库 Ø 面向对象数据库 上面4中数据库系 ...

  2. MySQL学习笔记-MySQL体系结构总览

    MySQL体系结构总览 不管是用哪种数据库,了解数据库的体系结构都是极为重要的.MySQL体系结构主要由数据库和数据库实例构成. 数据库:物理操作系统文件或者其它文件的集合,在mysql中,数据库文件 ...

  3. 【mysql学习笔记整理】

    /*mysql学习笔记整理*/ /*常用的数据库操作对象*/ #库的操作#创建#数据库的创建USE mysql;CREATE DATABASE db_x;#删除#删除数据库DROP DATABASE ...

  4. 一千行MySQL学习笔记 (转)

    出处:  一千行MySQL学习笔记 /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权 ...

  5. mysql basic operation,mysql总结,对mysql经常使用语句的详细总结,MySQL学习笔记

    mysql> select * from wifi_data where dev_id like "0023-AABBCCCCBBAA" ; 1.显示数据库列表.show d ...

  6. Mysql学习笔记(三)对表数据的增删改查。

    正文内容. 这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mys ...

  7. Mysql学习笔记(二)数据类型 补充

    原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求 String类型: i.char与 ...

  8. Mysql学习笔记(一)数据类型

    原文:Mysql学习笔记(一)数据类型 学习内容: Mysql基本数据类型. 1.数字类型.. i.整型     Mysql数据类型             含义(有符号)     tinyint(m ...

  9. 初识mysql学习笔记

    使用VMVirtualBox导入Ubuntu后,可以通过sudo apt-get install mysql-server命令下载mysql. 在学习过程中,我遇到了连接不上Xshell的问题.最终在 ...

随机推荐

  1. Linux内核设计第三周学习总结 跟踪分析Linux内核的启动过程

    陈巧然 原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验步骤 登陆实验楼虚 ...

  2. 【loj6198】谢特

    Portal -->loj6198 Solution ​ (为什么感觉loj上面这几道后缀数组的题..套路都是一样的啊qwq) ​ 同样也是..考虑某个区间\(height[i]\)的最小值的贡 ...

  3. 玲珑学院oj 1152 概率dp

    1152 - Expected value of the expression Time Limit:2s Memory Limit:128MByte Submissions:128Solved:63 ...

  4. Codeforces 934.C A Twisty Movement

    C. A Twisty Movement time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. IO多路复用之epoll(一)讲解

    网络通信中socket有自己的内核发送缓冲区和内核接受缓冲区,好比是一个水池, 当用户发送数据的时候会从用户缓冲区拷贝到socket的内核发送缓冲区,然后从 socket发送缓冲区发出去, 当用户要读 ...

  6. DEV GridControl打印 导出

    /// <summary> /// 打印 /// </summary> /// <param name="sender"></param& ...

  7. 维护后面的position sg函数概念,离线+线段 bzoj 3339

    3339: Rmq Problem Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1160  Solved: 596[Submit][Status][ ...

  8. web开发之Servlet 三

    昨天我们学习了Servlet的运行过程和生命周期,那么今天我们学习下Servlet中非常重要的两个类:ServletConfig  ServletContext 我们可以看到,与顶层Servlet主动 ...

  9. 【CodeForces】626 F. Group Projects 动态规划

    [题目]F. Group Projects [题意]给定k和n个数字ai,要求分成若干集合使得每个集合内部极差的总和不超过k的方案数.n<=200,m<=1000,1<=ai< ...

  10. Thinkphp的SQL查询方式

    一.普通查询方式 a.字符串$arr=$m->where("sex=0 and username='gege'")->find();b.数组$data['sex']=0 ...