触发器-数据库

触发器

一、案例描述 触发器是一种与表有关的操作对象,当表上出现指定事件(I N S E R T 、UPDATE、DELETE)时,会调用触发器对象,执行触发器的操作。

本文主要讲三种类型的触发器,文章稍长,但简单明了,希望能帮到你

二、实现步骤

1.创建触发器

#选用数据库

use shop

#创建用户表user

DROP TABLE IF EXISTS USER;
CREATE TABLE USER(
id INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(255),
sex VARCHAR(10),
PRIMARY KEY(id)
);

#创建统计表stat

DROP TABLE IF EXISTS stat;
CREATE TABLE stat(
id INT NOT NULL AUTO_INCREMENT,
num INT,
PRIMARY KEY(id)
);

#在统计表中插入一条数据,默认值为0

INSERT INTO stat VALUES (1,0);

#创建一个触发器来计算用户的数量,统计数量的值放置在stat的num字段里

DROP TRIGGER IF EXISTS cpuNum;
DELIMITER $$
CREATE TRIGGER cpuNum
AFTER INSERT ON USER
FOR EACH ROW
BEGIN
	UPDATE stat SET num=num+1 WHERE id=1;
END $$
DELIMITER ;

#查看统计表stat中的数量num=0

SELECT * FROM stat;

在这里插入图片描述
#在用户表user中插入一条数据

INSERT INTO USER VALUES(1,'小明','男');

#统计表stat中的num加1

SELECT * FROM stat;

在这里插入图片描述
#在用户表user中再插入一条数据

INSERT INTO USER VALUES(2,'小红','女');

#统计表stat中的num再加1
在这里插入图片描述

2. 使用NEW和OLD关键字

#创建员工表employee

DROP TABLE IF EXISTS employee;
CREATE TABLE employee(
id INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(255),
sex VARCHAR(10),
age INT,
deptId INT,
PRIMARY KEY(id)
);

#创建部门表dept

DROP TABLE IF EXISTS dept;
CREATE TABLE dept(
id INT NOT NULL AUTO_INCREMENT,
deptName VARCHAR(255),
manager VARCHAR(255),
PRIMARY KEY(id)
);

#创建工资表payroll

DROP TABLE IF EXISTS payroll;
CREATE TABLE payroll(
id INT NOT NULL AUTO_INCREMENT,
empId INT,
salary VARCHAR(255),
grantDate DATE,
PRIMARY KEY(id)
);

#插入员工

INSERT INTO employee VALUES(1,'张明','男',30,1);
INSERT INTO employee VALUES(2,'孙浩','男',25,1);
INSERT INTO employee VALUES(3,'张静','女',28,2);
INSERT INTO employee VALUES(4,'赵颖','女',32,2);
INSERT INTO employee VALUES(5,'刘帅','男',28,2);

#插入部门

INSERT INTO dept VALUES(1,'软件开发部','王洋');
INSERT INTO dept VALUES(2,'人力资源部','吴刚');

#查询员工表中的数据

SELECT * FROM employee;

触发器-数据库_第1张图片

#查询部门表中的数据

SELECT * FROM dept;

在这里插入图片描述
#创建按部门删除员工的触发器,删除部门后,触发器会自动删除这个部门的员工

DROP TRIGGER IF EXISTS deleteEmp;
DELIMITER $$
CREATE TRIGGER deleteEmp
AFTER DELETE ON dept
FOR EACH ROW
BEGIN
	DELETE FROM employee WHERE deptId=old.id;
END $$
DELIMITER ;

old.id是代表触发器里
DELETE ON dept
这个事件发生之前的id,即old可以用于指代事件发生之前的表元素,例如old.id。
同理,new可以用于指代事件发生之后的表元素,例如new.id。

#删除部门id等于1,触发器会删除这个部门下的员工

DELETE FROM dept WHERE id = 1;

#查询部门表中的数据

SELECT * FROM dept;

在这里插入图片描述
#查询员工表中的数据,可以看到deptId等于1的员工被删除

SELECT * FROM employee;

在这里插入图片描述

3.INSERT型触发器

#创建员工表employee

DROP TABLE IF EXISTS employee;
CREATE TABLE employee(
id INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(255),
salary INT,
PRIMARY KEY(id)
);

#创建记录表,来记录工资低于3 500元的员工

DROP TABLE IF EXISTS record;
CREATE TABLE record(
id INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(255),
salary INT,
PRIMARY KEY(id)
);

#创建触发器,添加低于3 500元的工资到记录表里

DROP TRIGGER IF EXISTS addRecord;
DELIMITER $$
CREATE TRIGGER addRecord
AFTER INSERT ON employee
FOR EACH ROW
BEGIN
	IF(new.salary<3500)THEN
	INSERT INTO record VALUES(new.id,new.name,new.salary);
	END IF;
END $$
DELIMITER ;

#在员工表里插入一条工资低于3 500元的员工记录

INSERT INTO employee VALUES(1,'小明',2800);

#查询员工表employee中的数据,可以看到插入成功

SELECT * FROM employee;

在这里插入图片描述
#查询记录表record中的数据,可以看到插入一条低于3 500元工资的员工记录

SELECT * FROM record;

在这里插入图片描述
#再插入一条高于3 500元工资的员工记录

INSERT INTO employee VALUES(2,'小红',5600);

在这里插入图片描述
#查询记录表record中的数据,工资高于3 500元的员工没有插入

SELECT * FROM record;

在这里插入图片描述

4.UPDATE型触发器

#创建更新触发器,在employee工资表中进行修改,工资大于3 500元,则删除记录表中的对应数据,否则插入或者修改记录表中的数据,REPLACE可以用于插入或者更新记录

DROP TRIGGER IF EXISTS updateRecord;
DELIMITER $$
CREATE TRIGGER updateRecord
AFTER UPDATE ON employee
FOR EACH ROW
BEGIN
	IF (new.salary>3500) THEN
	DELETE FROM record WHERE id=new.id;
	ELSE
	REPLACE INTO record VALUES(NEW.id,NEW.name,NEW.salary);
	END IF;
END $$
DELIMITER ;

#将员工id为1的工资从2 800元更改为6 000元

UPDATE employee SET salary = 6000 WHERE id=1;

#查看员工表employee

SELECT * FROM employee;

在这里插入图片描述
#工资大于3 500元,在记录表中删除员工id为1的数据。
#查看记录表record

SELECT * FROM record;

在这里插入图片描述
#将员工id为2的工资从5 600元改为2 000元

UPDATE employee SET salary = 2000 WHERE id=2;

#修改成功

SELECT * FROM employee;

在这里插入图片描述
#插入员工id为2的记录,工资小于3 500元

SELECT * FROM record;

在这里插入图片描述
#将员工id为2的工资从2 000元更改为2 500元,工资还是低于3 500元,应该更改记录表中的数据

UPDATE employee SET salary = 2500 WHERE id=2;

在这里插入图片描述

注意:之所以触发器用replace,即:

REPLACE INTO record VALUES(NEW.id,NEW.name,NEW.salary);

是因为考虑到无论是insert还是update

INSERT INTO record VALUES(NEW.id,NEW.name,NEW.salary);
UPDATE record SET id=new.id,NAME=new.name,salary=new.salary;

都有一定的局限性:insert只能用于插入,而update只能用于更新。但是REPLACE可以用于插入或者更新记录

5.DELETE型触发器

#创建删除触发器,删除记录表中的数据

DROP TRIGGER IF EXISTS delRecord;
DELIMITER $$
CREATE TRIGGER delRecord
AFTER DELETE ON employee
FOR EACH ROW
BEGIN
	DELETE FROM record WHERE id=old.id;
END $$
DELIMITER ;

#删除员工id为2的记录

DELETE FROM employee WHERE id = 2;

#查询员工表employee中的数据,员工id为2的数据已被删除

SELECT * FROM employee;

在这里插入图片描述
#记录表中员工id为2的记录也被删除

SELECT * FROM record;

在这里插入图片描述

你可能感兴趣的:(数据库,触发器,mysql,数据库)