今天又学习了一下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. 【bzoj2500】幸福的道路

    Portal -->bzoj2500 Description ​  给你一棵树,每条边有边权,有两个给给的人第\(i\)天会从编号为\(i\)的点出发走这个点的树上最长距离,现在要你求一个最长的 ...

  2. activiti学习-用户与用户组

    activiti学习笔记3-用户与用户组 2015年05月07日 14:43:06 cq1982 阅读数:4142更多 个人分类: activiti工作流引擎   (本博客都是纯文本手工代码,错误难免 ...

  3. P值解释和误区

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&am ...

  4. Python学习笔记(二十五)操作文件和目录

    摘抄:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319253241 ...

  5. C11构造函数的改善

    1.委托构造函数 委托构造函数就是允许在同一个类中一个构造函数可以调用另一个构造函数,从而在初始化时简化变量的初始化. class CTest { public: int x; int y; int ...

  6. Linux高级编程--02.gcc和动态库

    在Linux环境下,我们通常用gcc将C代码编译成可执行文件,如下就是一个简单的例子: 小实验:hello.c #include <stdlib.h> #include <stdio ...

  7. 【BZOJ】3991: [SDOI2015]寻宝游戏 虚树+DFS序+set

    [题意]给定n个点的带边权树,对于树上存在的若干特殊点,要求任选一个点开始将所有特殊点走遍后返回.现在初始没有特殊点,m次操作每次增加或减少一个特殊点,求每次操作后的总代价.n,m<=10^5. ...

  8. XML & JSON---iOS-Apple苹果官方文档翻译

      技术博客http://www.cnblogs.com/ChenYilong/   新浪微博http://weibo.com/luohanchenyilong   //转载请注明出处--本文永久链接 ...

  9. UVA - 10494 If We Were a Child Again

    用java写的大数基本操作,java要求的格式比较严谨. import java.util.*; import java.math.*; public class Main { public stat ...

  10. Hibernate总结之常用API

    1. Configuration Configuration是用来读取配置文件,从配置文件中构件SessionFactory的. SessionFactory sessionFactory=new C ...