简介

MySQL从5.0.2版本开始支持触发器的功能。触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。

创建触发器

语法:

  CREATE TRIGGER trigger_name trigger_time trigger_event

    ON tb_name FOR EACH ROW trigger_stmt

根据语法来演示如何创建一个触发器,首先创建2张表:student 和 student_demo

-- CREATE TABLE student
CREATE TABLE `student` (
  `id` ) unsigned NOT NULL AUTO_INCREMENT,
  `name` ) NOT NULL,
  `age` ) NOT NULL,
  `gender` enum('女','男') NOT NULL,
  `address` ) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE DEFAULT CHARSET=utf8;

-- CREATE TABLE student_demo
CREATE TABLE `student_demo` (
  `id` ) NOT NULL,
  `name` ) NOT NULL,
  `address` ) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

现在假设在表student新增一条记录后,student_demo也需新增一条记录,根据此需求来演示触发器的创建

-- CREATE TRIGGER ins_student
CREATE TRIGGER ins_student AFTER INSERT ON student FOR EACH ROW
BEGIN
    INSERT INTO student_demo (id, name, address)
    VALUES
     (
        new.id,
        new.name,
         new.address
     );
END;

现在为student表创建了AFTER INSERT的触发器,在向student表插入数据时,student_demo也会插入相应的记录

可以看到,在向student表中新增一个名为"韩梅梅"的学生信息时,student_demo也新增了其对应信息

对于INSERT INTO...ON DUPLICATE KEY UPDATE语句,触发触发器的顺序有所不同。对student表分别创建BEFORE INSERT、AFTER INSERT、BEFORE UPDATE、AFTER UPDATE,插入记录观察结果。

 -- 创建表tri_test
 ), PRIMARY KEY (id))

 -- 创建before insert触发器
 CREATE TRIGGER ins_student_bef BEFORE INSERT ON student FOR EACH ROW
 BEGIN
     INSERT INTO tri_test (note)
 VALUES
     ('before insert');
 END;

 -- 创建after insert触发器
 CREATE TRIGGER ins_student_aft AFTER INSERT ON student FOR EACH ROW
 BEGIN
     INSERT INTO tri_test (note)
 VALUES
     ('after insert');
 END;

 -- 创建before update触发器
 CREATE TRIGGER upd_student_bef BEFORE UPDATE ON student FOR EACH ROW
 BEGIN
     INSERT INTO tri_test (note)
 VALUES
     ('before update');
 END;

 -- 创建after update触发器
 CREATE TRIGGER upd_student_aft AFTER UPDATE ON student FOR EACH ROW
 BEGIN
     INSERT INTO tri_test (note)
 VALUES
     ('after update');
 END;

现在student表中已有一条记录

现在对id=3的记录,插入数据

INSERT INTO student
VALUES
    (
        ,
        '李雷',
        ,
        '男',
        '河北石家庄'
    ) ON DUPLICATE KEY UPDATE NAME = 'update record'

表student和tri_test中的数据为:

对于有重复记录、需要进行UPDATE的INSERT操作,触发器出发的顺序是BEFORE INSERT、BEFORE UPDATE、AFTER UPDATE

如果是插入新的不重复的数据

INSERT INTO student
VALUES
    (
        ,
        '大卫',
        ,
        '男',
        '河北保定'
    ) ON DUPLICATE KEY UPDATE NAME = 'update record'

则表数据为

触发器的顺序为BEFORE INSERT、AFTER INSERT

删除触发器

一次可删除一个触发器,如果没有指定则默认为当前数据库。语法如下:

DROP TRIGGER [schema_name.]trigger_name

例如,要删除触发器ins_student,可以执行

查看触发器

SHOW TRIGGERS

可以通过SHOW TRIGGERS命令来查看触发器的状态、语法等信息,此命令查询的是所有触发器的信息

查询系统表

通过查询系统表中的information_schema.triggers表,可以查询指定触发器的信息

查询指定触发器"ins_student"的信息

MySQL触发器学习的更多相关文章

  1. 一篇很棒的 MySQL 触发器学习教程

    一.触发器概念 触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动 ...

  2. MySQL触发器学习总结

    1.What     触发器是MySQL响应DELETE,INSERT,UPDATE语句前后而自动执行的一条MySQL语句 2.Why(使用情形)     增加一个订单对应库存-1     删除一行在 ...

  3. MYSQL触发器学习笔记

    课程学至金色晨曦科技公司技术总监沙利穆 触发器 1.       什么是触发器 触发器是一种特殊类型的存储过程,不由用户直接调用.创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执 ...

  4. MySQL 触发器学习-markdown->html 格式测试

    <!doctype html>触发器 figure:first-child { margin-top: -20px; } #write ol, #write ul { position: ...

  5. mysql 触发器学习(可以将mysql数据同步到redis)

    1. 一个简单的例子 1.1. 创建表: create table t(s1 integer); 1.2. 触发器: delimiter | create trigger t_trigger befo ...

  6. mysql 触发器学习

    1. 一个简单的例子 1.1. 创建表: create table t(s1 integer); 1.2. 触发器: delimiter | create trigger t_trigger befo ...

  7. mysql触发器 学习

    1.       说明: 触发器的定义就是说某个条件成立的时候,你触发器里面所定义的语句就会被自动的执行.因此触发器不需要人为的去调用,也不能调用.然后,触发器的触发条件其实在你定义的时候就已经设定好 ...

  8. 关于mysql触发器和存储过程的理解

    内容源自:一篇很棒的 MySQL 触发器学习教程 一.触发器概念 触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊 ...

  9. MYSQL进阶学习笔记七:MySQL触发器的创建,应用及管理!(视频序号:进阶_16,17)

    知识点八:MySQL触发器的应用(16,17) 触发器的定义: 什么是触发器: 触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据是触发执行,他比数据库本身标准的功能有更精细和更复杂的数据 ...

随机推荐

  1. 集成 ssh第一阶段

    1.添加spring支持,包含spring-hibernate和spring-struts2.添加struts支持,包含struts-spring3.添加hibernate支持,在spring配置文件 ...

  2. 结巴(jieba)中文分词及其应用实践

    中文文本分类不像英文文本分类一样只需要将单词一个个分开就可以了,中文文本分类需要将文字组成的词语分出来构成一个个向量.所以,需要分词. 这里使用网上流行的开源分词工具结巴分词(jieba),它可以有效 ...

  3. Android hook神器frida(一)

    运行环境 ● Python – latest 3.x is highly recommended ● Windows, macOS, or Linux安装方法使用命令 sudo pip install ...

  4. java用户界面—创建一个面板

    先从基础学起 创建一个面板 代码如下: package Day08; import java.awt.FlowLayout; import javax.swing.JButton;import jav ...

  5. rsync随机启动脚本

    服务端 #!/bin/sh # chkconfig: # description: Saves and restores system entropy pool for \ #create by xi ...

  6. docker~Dockerfile优化程序的部署

    回到目录 一些理论 我们都知道docker这个容器工具可以帮助我们快速进行环境的部署,这对于运营人员来说,无疑是个福音,而这个工作大叔认为不应该是运营人员干的,而是由开发人员来做,因为只有你知道你干的 ...

  7. JavaScript中的函数:闭包,this,高阶函数

    一.函数基本理论 function compare(val1,val2){ return val1 - val2; }var result = compare(5,10); 1,函数的定义没什么意义, ...

  8. 替换Spring Boot 的EnableCaching注解

    SpringBoot 中可使用@Cacheable注解来更方便的使用redis,这个注解是通过拦截器工作的,使用了@Cacheable的方法执行时,执行到CglibAopProxy.java中的 Dy ...

  9. global,$GLOBALS[' '] 全局, 浮动float跟margin的注意事项

    $a; global只能声明变量为全局,不能赋值,否则报错未定义:global $a; 相对于$GLOBALS['a'],写法是这样的,所有定义过的变量都存在这里: //浮动float跟margin的 ...

  10. spring入门之环境搭建

    本人刚刚接触spring,看了一些教程,但是很多概念都不懂(以前没接触过,看着很抽象),所以我觉得通过动手可能会更好的理解并且掌握.看了一些小实例,但是都没有成功,终于在各种尝试之后搭建成功了,现在我 ...