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. 计算机硬盘大小转换(B,KB,MB,GB,TB,PB之间的大小转换)

    程序猿都非常懒.你懂的! java程序猿在实际的开发中会遇到非常多的单位换算问题.今天我给大家带来的是关于计算机硬盘大小的换算.多数情况下.一般要求b,kb,mb,gb,tb,pb之间的大小转换,我们 ...

  2. Spark Core Runtime分析: DAGScheduler, TaskScheduler, SchedulerBackend

    Spark Runtime里的主要层次分析,梳理Runtime组件和运行流程, DAGScheduler Job=多个stage,Stage=多个同种task, Task分为ShuffleMapTas ...

  3. React.Fragment 的作用:代替div作为外层

    https://segmentfault.com/a/1190000013220508 import React, { Fragment } from 'react'; <Fragment> ...

  4. JavaScript:表单常用验证脚本(整理)

    以下内容根据网上资源整理而来,主要来源是CSDN一个供下载的check.js,源码地址找不到了. 1. 检查输入字符串是否为空或者全部都是空格 /* 检查输入字符串是否为空或者全部都是空格 输入:st ...

  5. scratch资源

    火柴人工作室:https://scratch.mit.edu/studios/170355/ 像素工作室:https://scratch.mit.edu/studios/3667398/ snap官网 ...

  6. Bash Shell中Shift用法分享

    这篇文章主要介绍了Bash Shell中Shift的使用方法,需要的朋友可以参考下 shift可以用来向左移动位置参数.Shell的名字 $0第一个参数 $1第二个参数 $2第n个参数 $n所有参数 ...

  7. [svc][op]vim常用命令汇总

    vim常用命令汇总: 定位 本行第一个字符 ctrl+$ 本行最后一个字符 0gg 文章首行 ctrl+G 文章行尾 u 撤销(Undo) 删除 D 从当前位置删除到行尾 ("d$" ...

  8. Webpack中的sourcemap

    Webpack中sourcemap的配置 sourcemap是为了解决开发代码与实际运行代码不一致时帮助我们debug到原始开发代码的技术.尤其是如今前端开发中大部分的代码都经过编译,打包等工程化转换 ...

  9. android即时消息处理机制

    在android端做即时消息的时候.遇到的坑点是怎么保证消息即时性,又不耗电.为什么这么说呢?      原因是假设要保证消息即时性.通常有两种机制pull或者push. pull定时轮询机制,比較浪 ...

  10. Java多线程面试大全

    什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位,可以使用多线程对进行运算提速. 比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务 ...