MySql学习笔记——触发器
今天又学习了一下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学习笔记——触发器的更多相关文章
- MySQL学习笔记一
MySQL 学习笔记 一 一.数据库简单介绍 1. 按照数据库的发展时间顺序,主要出现了以下类型数据库系统: Ø 网状型数据库 Ø 层次型数据库 Ø 关系型数据库 Ø 面向对象数据库 上面4中数据库系 ...
- MySQL学习笔记-MySQL体系结构总览
MySQL体系结构总览 不管是用哪种数据库,了解数据库的体系结构都是极为重要的.MySQL体系结构主要由数据库和数据库实例构成. 数据库:物理操作系统文件或者其它文件的集合,在mysql中,数据库文件 ...
- 【mysql学习笔记整理】
/*mysql学习笔记整理*/ /*常用的数据库操作对象*/ #库的操作#创建#数据库的创建USE mysql;CREATE DATABASE db_x;#删除#删除数据库DROP DATABASE ...
- 一千行MySQL学习笔记 (转)
出处: 一千行MySQL学习笔记 /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权 ...
- mysql basic operation,mysql总结,对mysql经常使用语句的详细总结,MySQL学习笔记
mysql> select * from wifi_data where dev_id like "0023-AABBCCCCBBAA" ; 1.显示数据库列表.show d ...
- Mysql学习笔记(三)对表数据的增删改查。
正文内容. 这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mys ...
- Mysql学习笔记(二)数据类型 补充
原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求 String类型: i.char与 ...
- Mysql学习笔记(一)数据类型
原文:Mysql学习笔记(一)数据类型 学习内容: Mysql基本数据类型. 1.数字类型.. i.整型 Mysql数据类型 含义(有符号) tinyint(m ...
- 初识mysql学习笔记
使用VMVirtualBox导入Ubuntu后,可以通过sudo apt-get install mysql-server命令下载mysql. 在学习过程中,我遇到了连接不上Xshell的问题.最终在 ...
随机推荐
- POJ.3279 Fliptile (搜索+二进制枚举+开关问题)
POJ.3279 Fliptile (搜索+二进制枚举+开关问题) 题意分析 题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置( ...
- nginx php fastcgi Connection reset by peer的原因及解决办法
Connection reset by peer 这个错误是在nginx的错误日志中发现的,为了更全面的掌握nginx运行的异常,强烈建议在nginx的全局配置中增加 error_log logs ...
- Yarn 模式 与 电影受众分析系统
yarn模式分为两种模式: 一.Yarn-cluster模式 1.通过spark-submit提交spark jar包(Application),与RM进行通信请求启动AM 2.RM接收到请求之后,会 ...
- [CodeVs3196]黄金宝藏(DP/极大极小搜索)
题目大意:给出n(≤500)个数,两个人轮流取数,每次可以从数列左边或者右边取一个数,直到所有的数被取完,两个人都以最优策略取数,求最后两人所得分数. 显然这种类型的博弈题,第一眼就是极大极小搜索+记 ...
- 解题:POI 2007 Weights
题面 这是个$O(nlog^2$ $n)$的解法,因为蒟蒻博主没有看懂$O(nlog$ $n)$的更优秀的解法 显然从小到大装砝码是最优的方法,又显然从大到小装容器不会使得答案变劣,还显然砝码数具有单 ...
- Redundant data in update statements
Q: Hibernate generates UPDATE statements, which include all columns, regardless of whether I'm cha ...
- Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) A B C D 暴力 水 二分 几何
A. Vicious Keyboard time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 中南多校对抗赛 第三场 B
B:Arithmetic Progressions 题意: 给你一个长度为n的序列,问你这个序列中长度最长的等差数列长度为多少 题解: 方法一:将数组从小到大排序,n方扫,枚举出公差d,然后二分找有多 ...
- gflag使用
#include <gflags/gflags.h> #include <iostream> // 声明全局flag DEFINE_bool(my_bool, false, & ...
- 去除sql表格中的unique 唯一属性----phpmyadmin 没发现哪里好直接操作
ALTER TABLE tf_giftcard_record DROP INDEX oid;