本文主要讲三种类型的触发器,文章稍长,但简单明了,希望能帮到你
#选用数据库
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;
INSERT INTO USER VALUES(1,'小明','男');
#统计表stat中的num加1
SELECT * FROM stat;
INSERT INTO USER VALUES(2,'小红','女');
#创建员工表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 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;
#创建员工表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;
INSERT INTO employee VALUES(2,'小红',5600);
#查询记录表record中的数据,工资高于3 500元的员工没有插入
SELECT * FROM record;
#创建更新触发器,在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;
UPDATE employee SET salary = 2000 WHERE id=2;
#修改成功
SELECT * FROM employee;
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可以用于插入或者更新记录
#创建删除触发器,删除记录表中的数据
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;
SELECT * FROM record;