本博文源于mysql基础,旨在对触发器的创建/修改删除做学习与相应练习。
完成此章节的学习,需要创建如下表
create table tb_emp8(id int(11) primary key,
name varchar(22) unique,deptId int(11) not null,
salary float default 0,
constraint fk_emp_dept1 foreign key(deptId) references tb_dept1(id));
CREATE TABLE tb_emp6(id INT(11) PRIMARY KEY,name VARCHAR(25),
deptId INT(11),salary FLOAT);
CREATE TABLE tb_emp7(id INT(11) PRIMARY KEY,name VARCHAR(25),deptId INT(11),
salary FLOAT default 0);
为什么要使用触发器
触发器是被指定关联到一个表的数据库对象,当一个表的特定事件发生时,它将会被激活。主要用于保护表中的数据。mysql所支持的触发器一共有三种:INSERT触发器、UPDATE触发器、DELETE触发器.
INSERT触发器
在INSERT语句执行之前或之后响应的触发器。应注意如下:
- 对于AUTO_INCREMENT列,NEW在INSERT执行之前包含的值是0,在INSERT执行之后将包含新的自动生成值
UPDATE触发器
在UPDATE语句执行之前或之后响应的触发器。应注意如下:
- 在UPDATE触发器代码内,可引用一个名为NEW(不区分大小写)的虚拟表来访问更新的值。
- 在BEFORE UPDATE触发器中,NEW中的值也可以被更新,即允许更改将要用于UPDATE语句中的值(只要具有对应的操作权限)
- OLD的值全部是只读的,不能被跟新。
- 在UPDATE触发器代码内,可引用一个名为OLD(不区分大小写)的虚拟表来访问UPDATE语句执行前的值。
DELETE触发器
在DELETE语句执行之前或之后响应的触发器。应注意如下:
- OLD的值全部是只读的,不能被跟新。
- 在DELETE触发器代码内,可引用一个名为OLD(不区分大小写)的虚拟表来访问被删除的行。
创建触发器
基本语法
CREATE <触发器名> <BEFORE | AFTER >
<INSERT | UPDATE | DELETE>
ON <表名> FOR EACH Row<触发器主体>
创建BEFORE类型触发器
例子:数据表tb_emp8为员工信息表,包含id、name、deptId和salary字段,创建一个名为SumOfSalary的触发器,触发的条件是向数据表tb_emp8中插入数据之前,对新插入的salary字段值进行求和计算
需要先创建表
create table tb_emp8(id int(11) primary key,
name varchar(22) unique,deptId int(11) not null,
salary float default 0,
constraint fk_emp_dept1 foreign key(deptId) references tb_dept1(id));
create trigger SumOfSalary
before insert on tb_emp8
for each row
set @sum = @sum + NEW.salary;
SET @sum=0;
insert into tb_emp8 values(1,'A',1,1000),(2,'B',1,500);
select @sum;
创建AFTER类型触发器
例子:创建一个名为double_salary的触发器,触发的条件是向数据表tb_emp6中插入数据之后,再向数据表tb_emp7中插入相同的数据,并且salary为tb_emp6中新插入的salary字段值的2倍
create trigger double_salary after insert on tb_emp6
for each row
insert into tb_emp7 values (NEW.id,NEW.name,NEW.deptId,2*NEW.salary);
insert into tb_emp6 values(9,'C',1,6000);
修改和删除触发器
修改触发器就是删掉重新再创建。
基本语法
DROP TRIGGER [IF EXISTS] [数据库名] <触发器>
删除触发器
例子:删除double_salary触发器
drop trigger double_salary;