• MySQL 触发器


    触发器的使用

    (一)概念

    1. 触发器的这种特性可以协助应用在数据库端确保数据的完整性。也可以把触发器理解成一个特殊的存储过程,不需要显示调用,是自动被调用的存储过程。
    2. 监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,例如当对一个表进行操作(insert,delete, update)时就会激活它执行。
    

    (二)语法

    
    CREATE TRIGGER 触发器名 触发时机(BEFORE|AFTER) 触发事件(INSERT|UPDATE|DELETE)
    ON 表名 FOR EACH ROW
    BEGIN
    	执行语句列表;
    END 
    
    
    说明:
    - BEFORE和AFTER参数指定了触发执行的时间,在事件之前或是之后。
    - FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器的触发频率是针对每一行数据触发一次。
    - 触发事件参数详解:
      1. INSERT型触发器:插入某一行时激活触发器,可能通过INSERT、REPLACE 语句触发;
      2. UPDATE型触发器:更改某一行时激活触发器,可能通过UPDATE语句触发;
      3. DELETE型触发器:删除某一行时激活触发器,可能通过DELETE、REPLACE语句触发。
    
    

    (三)六种触发器的介绍

    BEFORE INSERT:在添加之前激活触发器
    BEFORE DELETE:在删除之前激活触发器
    BEFORE UPDATE:在修改之前激活触发器
    AFTER INSERT:在添加之后激活触发器
    AFTER DELETE:在删除之后激活触发器
    AFTER UPDATE:在修改之后激活触发器
    

    (四)案例

    表准备(创建一个times表)
    CREATE TABLE `times` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `createTime` datetime DEFAULT NULL,
    `state` varchar(100) DEFAULT NULL,
    PRIMARY KEY (`id`)
    )
    
    字段说明:
    	createTime:为添加数据的当前时间
    	state:是状态信息
    
    案例1: 当往user表添加数据后,需要使用触发器同时往times表添加一条数据。 
    例如: user表中添加了一条数据。。。。
        
    create trigger user_insert_after after insert on user for each row
    begin
    		insert into times values(null,now(),'user表中添加了一条数据');
    end;
    
    
    注: 删除、修改类型的触发器同理,只需要修改触发器后的关键字即可
    
    案例2: 当user表中的数据被删除,需要使用触发器同时往times表添加一条数据
    例如: user表中删除了一条数据。。
    
    create trigger user_delete_after after delete on user for each row
    begin
    		insert into times values(null,now(),'user表中删除了一条数据');
    end;
        
    
    3. NEW与OLD介绍
    	MySQL 中定义了 NEW 和 OLD,用来表示触发器的所在表中,触发了触发器的那一行数据,来引用触发器中发生变化的记录内容,具体地:
      ① 在INSERT型触发器中,NEW用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
      ② 在UPDATE型触发器中,OLD用来表示将要或已经被修改的原数据,NEW用来表示将要或已经修改为			的新数据;
      ③ 在DELETE型触发器中,OLD用来表示将要或已经被删除的原数据;
    使用方法:
    	NEW.columnName (columnName为相应数据表某一列名)
    
    
    
    
    
        案例4: 检查性别是否合法,年龄是否合法
    
        手动抛异常
        SIGNAL SQLSTATE '428E8' SET MESSAGE_TEXT = message;
    
    案例3:使用new关键字获得插入语句中的数据
    create trigger user_insert_after_2 after insert on user for each row
    begin
    		insert into times values(null,now(),concat('user表中添加了一条数据: id:',new.uid,'name:',new.uname));
    end;
    
     案例4: 检查性别是否合法,年龄是否合法
     
     create table user3(
    	id int primary key auto_increment,
    	name varchar(20),
    	age int,
    	sex varchar(10)
    )
    
    create trigger user3_insert_before before insert on user3 for each row
    begin
    		if new.age < 0 or new.age >150 then
    			SIGNAL SQLSTATE '428E8' SET MESSAGE_TEXT = '年龄不合法,应该在0-150以内';
    		end if;
    end;
    
    4. 查看触发器 
    	语法: SHOW TRIGGERS;
    
    5. 删除触发器 
    	语法 : DROP TRIGGER 触发器名 
    
  • 相关阅读:
    记录java设计模式中适配器模式和装饰器模式和代理模式的区别
    excel工具类记录
    docker搭建图床 chevereto 非常方便
    docker 安装mysql
    rabbitmq学习之路(八)
    理解js中的作用域,作用域链以及闭包
    浏览器解析js的顺序
    javacript 组合使用构造函数模式和原型模式
    js垃圾回收机制与深拷贝和浅拷贝
    ES6 变量的解构赋值
  • 原文地址:https://www.cnblogs.com/conglingkaishi/p/15215451.html
Copyright © 2020-2023  润新知