转:
触发器-数据库
触发器
一、案例描述 触发器是一种与表有关的操作对象,当表上出现指定事件(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;
#在用户表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;
#查询部门表中的数据
SELECT * FROM dept;
#创建按部门删除员工的触发器,删除部门后,触发器会自动删除这个部门的员工
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;
#查询员工表中的数据,可以看到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 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;
#查询记录表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 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;
#工资大于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 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;
#记录表中员工id为2的记录也被删除
SELECT * FROM record;
转:
触发器-数据库