触发器-数据库    

转:

触发器-数据库

 

 

 

触发器

一、案例描述 触发器是一种与表有关的操作对象,当表上出现指定事件(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 cpuNumAFTER INSERT ON USERFOR EACH ROWBEGIN
	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;

 

触发器-数据库_数据库_02
#在用户表user中再插入一条数据

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

 

#统计表stat中的num再加1
触发器-数据库_数据库_03

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;

 

触发器-数据库_数据库_04

#查询部门表中的数据

SELECT * FROM dept;

 

触发器-数据库_数据库_05
#创建按部门删除员工的触发器,删除部门后,触发器会自动删除这个部门的员工

DROP TRIGGER IF EXISTS deleteEmp;DELIMITER $$CREATE TRIGGER deleteEmpAFTER DELETE ON deptFOR EACH ROWBEGIN
	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;

 

触发器-数据库_数据库_06
#查询员工表中的数据,可以看到deptId等于1的员工被删除

SELECT * FROM employee;

 

触发器-数据库_数据库_07

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 addRecordAFTER INSERT ON employeeFOR EACH ROWBEGIN
	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;

 

触发器-数据库_数据库_08
#查询记录表record中的数据,可以看到插入一条低于3 500元工资的员工记录

SELECT * FROM record;

 

触发器-数据库_数据库_09
#再插入一条高于3 500元工资的员工记录

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

 

触发器-数据库_数据库_10
#查询记录表record中的数据,工资高于3 500元的员工没有插入

SELECT * FROM record;

 

触发器-数据库_数据库_11

4.UPDATE型触发器

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

DROP TRIGGER IF EXISTS updateRecord;DELIMITER $$CREATE TRIGGER updateRecordAFTER UPDATE ON employeeFOR EACH ROWBEGIN
	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;

 

触发器-数据库_数据库_12
#工资大于3 500元,在记录表中删除员工id为1的数据。
#查看记录表record

SELECT * FROM record;

 

触发器-数据库_数据库_13
#将员工id为2的工资从5 600元改为2 000元

UPDATE employee SET salary = 2000 WHERE id=2;

 

#修改成功

SELECT * FROM employee;

 

触发器-数据库_数据库_14
#插入员工id为2的记录,工资小于3 500元

SELECT * FROM record;

 

触发器-数据库_数据库_15
#将员工id为2的工资从2 000元更改为2 500元,工资还是低于3 500元,应该更改记录表中的数据

UPDATE employee SET salary = 2500 WHERE id=2;

 

触发器-数据库_数据库_16

注意:之所以触发器用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 delRecordAFTER DELETE ON employeeFOR EACH ROWBEGIN
	DELETE FROM record WHERE id=old.id;END $$DELIMITER ;

 

#删除员工id为2的记录

DELETE FROM employee WHERE id = 2;

 

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

SELECT * FROM employee;

 

触发器-数据库_数据库_17
#记录表中员工id为2的记录也被删除

SELECT * FROM record;

 

触发器-数据库_数据库_18

转:

触发器-数据库