触发器的使用
(一)概念
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 触发器名