mysql(创建/修改删除)触发器(含实战练习)

本博文源于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;

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_37149062/article/details/106816533
今日推荐