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. echarts geo地图坐标转换为页面Offset坐标

    https://github.com/apache/incubator-echarts/issues/2540 代码示例: // 获取系列 ) // 获取地理坐标系实例 var coordSys = ...

  2. django中处理文件上传文件

    1 template模版文件uploadfile.html 特别注意的是,只有当request方法是POST,且发送request的<form>有属性enctype="multi ...

  3. spineRunTime for cocos2dx v3 中动画播完删除animation

    spineRunTime for cocos2dx v3 中删除animation,发现下面写法会崩溃:   spine::SkeletonAnimation* animationNode = spi ...

  4. TRIZ系列-创新原理-9~11-预先反作用原理、预处理原理、预先防范原理

    一.预先反作用原理表述例如以下: 1)预先给物体施加反作用,以补偿过量的或者不想要的压力. 假设知道系统在执行过程中,会有不利的或者有害的作用(负面作用)产生,则能够预先採取一定的措施来抵消.控制这样 ...

  5. vim利用插件管理工具-管理配置文件

    目前被广泛应用的2各插件管理工具Pathogen和Vunble,我先说Pathogen Pathogen Pathogen完全用vim脚本编写,不用其他的代码(Vunble就用了python),所以安 ...

  6. 了不起的 “filter(NULL IS NOT NULL)”

    经常会在执行计划中看到很奇怪的"FILTER"操作,然后看对应的执行信息是"filter(NULL IS NOT NULL)".  其实这是优化器非常聪明的“短 ...

  7. python random模块(获取随机数)的常用方法及示例

    random.randomrandom.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 random.uniformrandom.uniform(a, b),用 ...

  8. 使用 Electron 构建桌面应用(拖动控制篇)

    使用 Electron 构建桌面应用(拖动控制篇) 当窗口被定义了大小,我们也就是在自定义这个窗口,使得它不可拉伸没有框架,让它看起来就像一个真正的声效器浮在桌面上. 现在问题来了 – 要如何移动或者 ...

  9. QDialog:输入对话框、颜色对话框、字体对话框、文件对话框

    # _*_ coding:utf-8 _*_ import sys from PyQt4 import QtCore,QtGui class Example(QtGui.QWidget): def _ ...

  10. 教程-Delphi中比较两个对象是否一致及地址是否相同

    资料说明: 1.http://blog.csdn.net/diligentcatrich/article/details/7077294 说明: 实例代码: procedure TForm1.btn1 ...