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 触发器名 
原文地址:https://www.cnblogs.com/conglingkaishi/p/15215451.html