MySQL数据库-MySQL触发器

对某个表进行【增/删/改】操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行【增/删/改】前后的行为。

1、创建触发器基本语法

TRIGGER触发器
BEFORE之前
AFTER之后
INSERT插入
DELETE删除
UPDATE更新

# 插入前
-- CREATE(创建) TRIGGER(触发器) 触发器名称 BEFORE(之前) INSERT(插入) ON 表名称 FOR(为) EACH(每一) ROW(行)
-- BEGIN(触发器开始)
-- 触发器行为......
-- END(触发器结束)
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
BEGIN
...
END # 插入后
-- CREATE(创建) TRIGGER(触发器) 触发器名称 AFTER(之后) INSERT(插入) ON 表名称 FOR(为) EACH(每一) ROW(行)
-- BEGIN(触发器开始)
-- 触发器行为......
-- END(触发器结束)
CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
BEGIN
...
END # 删除前
-- CREATE(创建) TRIGGER(触发器) 触发器名称 BEFORE(之前) DELETE(删除) ON 表名称 FOR(为) EACH(每一) ROW(行)
-- BEGIN(触发器开始)
-- 触发器行为......
-- END(触发器结束)
CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW
BEGIN
...
END # 删除后
-- CREATE(创建) TRIGGER(触发器) 触发器名称 AFTER(之后) DELETE(删除) ON 表名称 FOR(为) EACH(每一) ROW(行)
-- BEGIN(触发器开始)
-- 触发器行为......
-- END(触发器结束)
CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW
BEGIN
...
END # 更新前
-- CREATE(创建) TRIGGER(触发器) 触发器名称 BEFORE(之前) UPDATE(更新) ON 表名称 FOR(为) EACH(每一) ROW(行)
-- BEGIN(触发器开始)
-- 触发器行为......
-- END(触发器结束)
CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW
BEGIN
...
END # 更新后
-- CREATE(创建) TRIGGER(触发器) 触发器名称 AFTER(之后) UPDATE(更新) ON 表名称 FOR(为) EACH(每一) ROW(行)
-- BEGIN(触发器开始)
-- 触发器行为......
-- END(触发器结束)
CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW
BEGIN
...
END

2、实列,创建一张表插入之前的触发器

当向指定的一张表插入一条数据时,触发器自动向另外一张表插入一条数据

有这样两个表

usr表

jif表

创建一个触发器,当向usr表插入一条数据之前,触发器自动向jif表插入一条数据

# 插入前
-- CREATE(创建) TRIGGER(触发器) 触发器名称 BEFORE(之前) INSERT(插入) ON 表名称 FOR(为) EACH(每一) ROW(行)
-- BEGIN(触发器开始)
-- 触发器行为......
-- END(触发器结束) delimiter $$ -- 因为可能有多条触发行为,所有需要修改语句结束符
DROP TRIGGER if EXISTS chufa_qi_usr; -- 判断这个触发器如果存在删除 CREATE TRIGGER chufa_qi_usr BEFORE INSERT ON usr FOR EACH ROW -- 给usr表创建一个插入数据之前的触发器
BEGIN
INSERT INTO jif (jif) VALUES (''); -- 向jif表的jif字段插入值123
END $$
delimiter ;

 可以看到usr表的触发器已经创建

当向usr表插入一条数据之前,触发器会自动向jif表的jif字段插入一条数据

INSERT INTO usr (yhm,xb,nl) VALUES ('张无忌','男',''); -- 向usr表插入数据

 注意:其他的、增、删、改、之前或者之后触发器原理相同

3、在触发器里获取到,触发器表指定字段的插入值

NEW获取触发器表指定字段的插入值,后面跟要获取值的字段名称,如:NEW.nl

获取触发器表指定字段的插入值,可以做判断和传值写入等操作

举例:判断触发表插入数据时,如果nl字段值等于30将nl字段值写入另外一张表

-- CREATE(创建) TRIGGER(触发器) 触发器名称 BEFORE(之前) INSERT(插入) ON 表名称 FOR(为) EACH(每一) ROW(行)
-- BEGIN(触发器开始)
-- 触发器行为......
-- END(触发器结束) delimiter $$ -- 因为可能有多条触发行为,所有需要修改语句结束符
DROP TRIGGER if EXISTS chufa_qi_usr; -- 判断这个触发器如果存在删除 CREATE TRIGGER chufa_qi_usr BEFORE INSERT ON usr FOR EACH ROW -- 给usr表创建一个插入数据之前的触发器
BEGIN
IF NEW.nl = '' THEN -- 判断插入数据时触发表的nl字段的值如果等于30
INSERT INTO jif (jif) VALUES (NEW.nl); -- 获取触发器表插入数据时的nl字段值,插入到jif表的jif字段里
END IF;
END $$
delimiter ;

插入数据

INSERT INTO usr (yhm,xb,nl) VALUES ('东方不败','男',''); -- 向usr表插入数据

4、在触发器里获取到,触发器表指定字段的删除值

OLD获取触发器表指定字段的删除值,后面跟要获取值的字段名称,如:OLD.nl

获取触发器表指定字段的删除值,可以做判断和传值写入等操作

举例:判断触发表删除数据时,如果nl字段值等于30将nl字段值写入另外一张表

-- CREATE(创建) TRIGGER(触发器) 触发器名称 BEFORE(之前) DELETE(删除) ON 表名称 FOR(为) EACH(每一) ROW(行)
-- BEGIN(触发器开始)
-- 触发器行为......
-- END(触发器结束) delimiter $$ -- 因为可能有多条触发行为,所有需要修改语句结束符
DROP TRIGGER if EXISTS chufa_qi_usr; -- 判断这个触发器如果存在删除 CREATE TRIGGER chufa_qi_usr BEFORE DELETE ON usr FOR EACH ROW -- 给usr表创建一个插入数据之前的触发器
BEGIN
IF OLD.nl = '' THEN -- 判断删除数据时触发表的nl字段的值如果等于30
INSERT INTO jif (jif) VALUES (OLD.nl); -- 获取触发器表删除数据时的nl字段值,插入到jif表的jif字段里
END IF;
END $$
delimiter ;

删除数据

DELETE FROM usr WHERE id=15; -- 删除usr表id等于15的数据

5、触发器获取触发表操作字段值重点:

NEW获取触发表插入数据时,指定字段的插入值(插入数据使用)

OLD获取触发表删除数据时,指定字段的删除值(删除数据使用)

NEW、OLD更新数据时都可以使用(更新数据使用)

第二百八十四节,MySQL数据库-MySQL触发器的更多相关文章

  1. 第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册

    第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册 基于类的路由映射 from django.conf.urls import url, incl ...

  2. 第二百八十六节,MySQL数据库-MySQL事务操作(回滚)

    MySQL数据库-MySQL事务操作(回滚) 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 举例:有这样一张表 从表里可以看出张 ...

  3. 第二百八十五节,MySQL数据库-MySQL函数

    MySQL数据库-MySQL函数 1.MySQL内置函数 SELECT执行函数,后面跟要执行的函数 CHAR_LENGTH(str)函数:返回字符串的字符长度 -- CHAR_LENGTH(str)函 ...

  4. 第二百八十九节,MySQL数据库-ORM之sqlalchemy模块操作数据库

    MySQL数据库-ORM之sqlalchemy模块操作数据库 sqlalchemy第三方模块 sqlalchemysqlalchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API ...

  5. 第二百二十四节,jQuery EasyUI,ComboGrid(数据表格下拉框)组件

    jQuery EasyUI,ComboGrid(数据表格下拉框)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解 EasyUI 中 ComboGrid(数据表格下拉框)组件的 ...

  6. 第二百六十四节,Tornado框架-基于正则的动态路由映射分页数据获取计算

    Tornado框架-基于正则的动态路由映射分页数据获取计算 分页基本显示数据 第一步.设置正则路由映射配置,(r"/index/(?P<page>\d*)", inde ...

  7. 第二百七十四节,同源策略和跨域Ajax

    同源策略和跨域Ajax 什么是同源策略  尽管浏览器的安全措施多种多样,但是要想黑掉一个Web应用,只要在浏览器的多种安全措施中找到某种措施的一个漏洞或者绕过一种安全措施的方法即可.浏览器的各种保安措 ...

  8. 第二百三十四节,Bootstrap表单和图片

    Bootstrap表单和图片 学习要点: 1.表单 2.图片 本节课我们主要学习一下 Bootstrap 表单和图片功能,通过内置的 CSS 定义,显示各 种丰富的效果. 一.表单 Bootstrap ...

  9. 第二百八十四天 how can I 坚持

    又是一个周一.今天感觉过得好艰辛啊,幸好晚上程秀通过生日请客,吃了顿大餐,还拿回了一瓶酒.哈哈. 其他也没什么了.晚上玩的挺好.不过,回来,老是渴,一直想喝水,现在是又困,又累啊,睡觉了.

随机推荐

  1. JAVA命令行编译及运行

    第一部分:单文件 一.背景目标文件HelloWorld.java package ccdate; public class HelloWorld { public static void main(S ...

  2. js 数据结构-栈与队列

    /*[客栈的盘子/月井里的货物,后进先出]栈顶:最先入口/出口的位置栈底:最慢最晚出栈的位置*/ function Stack() { var item = []; //推(将货物推入月井) this ...

  3. mysql (已解决p)MYSQL5.7启动不了,本地计算机上的 MySQL57 服务启动后停止。

    找到目录E:\AppServ\MySQL\data 备份data中的数据,然后删除掉data中所有的东西(如果删除不掉请在进程中找到mysqld.exe并且关闭) 打开CMD cd E:\AppSer ...

  4. django中templates阅读笔记

    一.基本知识 1.模版是独立于django的,可以独立运行. 模版变量是用两个大括号括起来的字符串,表示变量.例如{{ person_name }} 模版标签,是用一对大括号和一对百分号括起来的,例如 ...

  5. java Webservice(一)HttpClient远程调用

    我们将Web Service发布在Tomcat或者其他应用服务器上后,有很多方法可以调用该Web Service,常用的有两种: 1.通过浏览器HTTP调用,返回规范的XML文件内容      2.通 ...

  6. 【转】Java对日期Date类进行加减运算,年份加减,月份加减

    import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date; public class Date ...

  7. form的method用get导致中文乱码

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  8. Jar/War/Ear等包的作用与区别详解

    以客户角度来看,jar文件就是一种封装格式,用户不需要知道jar包中有多少个.class格式的文件及每个文件中的功能与作用,也可以得到相应的访问的结果.java中除了jar格式还有war和ear等包文 ...

  9. Java字符串的格式化与输出

    Java字符串的格式化与输出 在C语言中格式化输出能够通过printf()函数实现,在Java中无需借助第三方工具相同能够实现此功能.自Java SE5后,java也提供了C语言中printf()风格 ...

  10. 有关一道printf 的面试题

    今天有个学生面试,面试题目里面有一道有关 printf 的输出问题 源代码如下: #include <stdio.h> int main(void) { int a = 10, b = 2 ...